正常和常数的混合模型
Mixture model of a normal and constant
我想对混合了正态分布和常数 0 的分布建模。
我找不到解决方案,因为在所有混合示例中,我发现 class 每个类别的分布都是相同的。
下面是一些代码来说明我在寻找什么:
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'])
我对数据恰好为零的速率以及非零时的法线参数感兴趣。
我正在建模的数据大致如下所示:
一种选择是尝试使用高斯混合模型,我们可以将 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 的分布建模。
我找不到解决方案,因为在所有混合示例中,我发现 class 每个类别的分布都是相同的。
下面是一些代码来说明我在寻找什么:
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'])
我对数据恰好为零的速率以及非零时的法线参数感兴趣。
我正在建模的数据大致如下所示:
一种选择是尝试使用高斯混合模型,我们可以将 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'])