Stan (pystan) создает вектор целых для присвоения категориальному распределению - PullRequest
0 голосов
/ 04 мая 2020

Первый раз, используя Стэн. Я начинаю с примера, найденного в классе Coursera, где они используют JAGS , который я пытаюсь переопределить в Stan. Класс свободен для аудита, и я связал соответствующую лекцию.

Справочная информация о модели:

(я не понимаю, как использовать LaTeX, поэтому я ' я постараюсь отформатировать это как можно лучше):
Модель представляет собой смешанную модель, в которой входными данными является вектор n действительных чисел с 2 потенциальными классами. Они предполагают, что это классы Z_1 ~ N(mu_1, stdev) и Z_2 ~ N(mu_2, stdev) (это смесь 2 нормалей с разными mu, но одинаковыми stdev). Они предполагают единообразный Дирихлект до alpha=1 вероятности нахождения в каждом классе.

Каждая точка данных извлекается из категориального распределения на основе вектора вероятности, и они увеличивают вероятность с соответствующей нормальной вероятностью.

Мой код

model_code_coursera = """
data {
    int<lower=1> N;         //Num Samples
    int<lower=1> K;         //Num classes
    real y[N];              //Input which we are trying to assign to each class
} parameters {
    simplex[K] probs;       //Prob of being in each class
    vector[K] mu;           //Center of each class
    real<lower=0> prec;
    vector<lower=0, upper=K>[N] z; //Array of classes ****(option 1)****
    int<lower=0, upper=K>[N] z;  // Array of classes ****(option 2)****
} model {
    probs ~ dirichlet(rep_vector(1,K));
    prec ~ gamma(1/2, 2/2);
    for (k in 1:K)
        mu[k] ~ normal(-1+2*(k-1), 1/100);
    for (n in 1:N) {
        z[n] ~ categorical(probs);
        y[n] ~ normal(mu[z[n]], prec);
    }
}
"""

Когда я использую опцию 1, я получаю сообщение об ошибке,

No matches for: 
  real ~ categorical(vector)
Available argument signatures for categorical:
  int ~ categorical(vector)

, которое имеет смысл, поскольку вывод категорийного типа является целым числом.

Однако, когда я делаю то, что имеет смысл и определить z как вектор целых чисел как Я вижу в шпаргалках Stan Я получаю другую ошибку (вариант 2)

    10:     int<lower=0, upper=K>[N] z;  // Array of classes
                                ^
    11: } model {
  -------------------------------------------------

PARSER EXPECTED: <identifier>

1 Ответ

0 голосов
/ 05 мая 2020

Stan напрямую не поддерживает целочисленные параметры. Для реализации модели нормальной смеси сорта, описанного в вопросе, дискретные параметры должны быть обособлены. Объяснение того, как это сделать, содержится в главе Руководства пользователя по смешанным моделям . Плюс в том, что смешивание намного лучше без дискретных параметров, а выводы в ожидании более точные.

...