2016-05-25 3 views
0

Я хотел бы, чтобы смоделировать распределение, которое представляет собой смесь нормального и константа 0.Смесь модель нормальной и постоянной

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

Вот код, чтобы проиллюстрировать то, что я ищу:

with pm.Model() as model: 
    x_non_zero = pm.Normal(...) 
    zero_rate = pm.Uniform('zero_rate', lower=0.0, upper=.0, testval=0.5) 
    fr = pm.Bernoulli('fr', p=zero_rate) 
    x = pm.???('x', pm.switch(pm.eq(fr, 0), x_non_zero, 0), observed=data['x']) 

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

Вот как данные я моделирования примерно выглядит следующим образом: Mixture of a normal with a constant

ответ

0

Один из вариантов будет попробовать с гауссовой модели смеси, мы можем думать о гауссовой с sd=0 как постоянное значение. Другим вариантом будет использовать модель, как следующее:

with pm.Model() as model: 
    mean = pm.Normal('mean', mu=100, sd=10) 
    sd = pm.HalfNormal('sd', sd=10) 

    category = pm.Categorical('category', p=[0.5, 0.5], shape=len(x)) 
    mu = pm.switch(pm.eq(category, 0), 0, mean) 
    eps = pm.switch(pm.eq(category, 0), 0.1, sd) 

    obs = pm.Normal('obs', mu=mu, sd=eps, observed=x) 

    step0 = pm.ElemwiseCategorical(vars=[category], values=[0, 1]) 
    step1 = pm.Metropolis(vars=[mean, sd]) 
    trace = pm.sample(10000, step=[step0, step1]) 

выяснить скорость можно вычислить

burnin = 100 
np.mean(trace[burnin]['category']) 
+0

Спасибо вам ответить! Считаете ли вы возможным расширить свою модель с помощью prior на 'p'' категории'? – smatting

+0

Добро пожаловать. Конечно, вы можете использовать дистрибутив Дирихле как предыдущий для категориального, например 'p = pm.Dirichlet ('p', a = np.array ([1., 1.]))' – aloctavodia

Смежные вопросы