2017-02-03 1 views
1

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.

Répondre

1

Le deuxième programme définit une densité différente. normal_lpdf renvoie une seule valeur scalaire qui est la somme de log pdfs sur les conteneurs de données/paramètres.

Il y a un chapitre sur les matrices/vecteurs par rapport aux tableaux dans le manuel.

Vous voulez tirer la définition de ppt plus haut pour l'efficacité.