混合模型的正常和常数

时间:2016-05-25 00:33:08

标签: pymc pymc3

我想模拟一个正态和常数为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

1 个答案:

答案 0 :(得分: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'])