2017-02-03 13 views
1

私はスタンを学習しており、単純な混合モデルを実装したかったのです。リファレンスマニュアル(スタン基準-2.14.0)においてスタンベクトル化の混合モデル

溶液が既に存在する:

data { 
    int<lower=1> K; // number of mixture components 
    int<lower=1> N; // number of data points 
    real y[N]; // observations 
} 
parameters { 
    simplex[K] theta; // mixing proportions 
    real mu[K]; // locations of mixture components 
    real<lower=0> sigma[K]; // scales of mixture components 
} 
model { 
    real ps[K]; // temp for log component densities 
    sigma ~ cauchy(0, 2.5); 
    mu ~ normal(0, 10); 
    for (n in 1:N) { 
    for (k in 1:K) { 
     ps[k] = log(theta[k]) 
     + normal_lpdf(y[n] | mu[k], sigma[k]); 
    } 
    target += log_sum_exp(ps); 
    } 
} 

次のページは、外側ループのベクトル化が不可能であることが記載されています。しかし、私は内側のループのparallizationがまだあるかどうか疑問に思っていました。

だから、私は次のモデルを試みた:

data { 
    int<lower=1> K; // number of mixture components 
    int<lower=1> N; // number of data points 
    real y[N]; // observations 
} 

parameters { 
    simplex[K] theta; // mixing proportions 
    vector[K] mu; // locations of mixture components 
    vector<lower=0>[K] sigma; // scales of mixture components 
} 

model { 
    vector[K] ps;//[K]; // temp for log component densities 
    vector[K] ppt; 
    sigma ~ cauchy(0, 2.5); 
    mu ~ normal(0, 10); 
    for (n in 1:N) { 
    ppt = log(theta); 
    /* 
    for (k in 1:K) { 
     ps[k] = ppt[k] + //log(theta[k]) 
     normal_lpdf(y[n] | mu[k], sigma[k]); 
    } 
    */ 
    ps = ppt + normal_lpdf(y[n] | mu, sigma); 
    target += log_sum_exp(ps); 
    } 
} 

を...と、このモデルは、(元のモデルとは対照的に)間違って見積りを行います。

data("faithful") 
erupdata <- list(
    K = 2, 
    N = length(faithful$eruptions), 
    y = faithful$eruptions 
) 

fiteruptions <- stan(file = 'mixturemodel.stan', data = erupdata, iter = 1000, chains = 1) 

私はモデルの仕様について間違っていると思います。シンタックスが提供する違い(特にvector[K]real[K]の違い)を理解したいと思います。そして、おそらくスタンに深い洞察を得るでしょう。

答えて

1

第2のプログラムは、異なる密度を定義します。 normal_lpdfは、データ/パラメータのコンテナに対するlog pdfsの合計である単一のスカラー値を返します。

マニュアルの行列/ベクトル対配列に関する章があります。

pptの定義を効率的に引き上げたいとします。

関連する問題