J'apprends maintenant Stan et je voulais mettre en œuvre un modèle de mélange simple.Modèles de mélange dans Stan - vectorisation
En il y a une solution déjà manuel de référence (stan-référence-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);
}
}
La page suivante décrit que la vectorisation de la boucle extérieure est impossible. Cependant, je me demandais si la parallélisation de la boucle interne est toujours.
Et donc j'ai essayé le modèle suivant:
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);
}
}
... et ce modèle faire des estimations erronées (par opposition au modèle original). Je me demande, ce que je comprends mal au sujet de la spécification du modèle. Je voudrais comprendre la différence que la syntaxe fournit (entre autres la différence entre vector[K]
et real[K]
) et peut-être obtenir des informations plus approfondies sur Stan.