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]
の違い)を理解したいと思います。そして、おそらくスタンに深い洞察を得るでしょう。