我正在尝试使用PYMC3中的Mixture
的两个beta分布的混合物(我不知道每个分布的权重)。这是代码:
model=pm.Model()
with model:
alpha1=pm.Uniform("alpha1",lower=0,upper=20)
beta1=pm.Uniform("beta1",lower=0,upper=20)
alpha2=pm.Uniform("alpha2",lower=0,upper=20)
beta2=pm.Uniform("beta2",lower=0,upper=20)
w=pm.Uniform("w",lower=0,upper=1)
b1=pm.Beta("B1",alpha=alpha1,beta=beta1)
b2=pm.Beta("B2",alpha=alpha2,beta=beta2)
mix=pm.Mixture("mix",w=[1.0,w],comp_dists=[b1,b2])
运行此代码后,我会收到以下错误:AttributeError: 'list' object has no attribute 'mean'
。有任何建议吗?
pymc3带有一个包含有用示例的pymc3.tests
模块。通过搜索该目录以查看"混合"一词,我遇到了这个示例:
Mixture('x_obs', w,
[Normal.dist(mu[0], tau=tau[0]), Normal.dist(mu[1], tau=tau[1])],
observed=self.norm_x)
请注意,clastMethod dist
被调用。谷歌搜索" Pymc3 Dist ClassMethod"导致此DOC页面,该页面解释了
...每个
Distribution
都有一个dist
类方法,该方法返回可以在PYMC模型之外使用的脱落分配对象。
除此之外,我还不清楚为什么这里需要剥离的分布,但它似乎有效:
import pymc3 as pm
model = pm.Model()
with model:
alpha1 = pm.Uniform("alpha1", lower=0, upper=20)
beta1 = pm.Uniform("beta1", lower=0, upper=20)
alpha2 = pm.Uniform("alpha2", lower=0, upper=20)
beta2 = pm.Uniform("beta2", lower=0, upper=20)
w = pm.Uniform("w", lower=0, upper=1)
b1 = pm.Beta.dist(alpha=alpha1, beta=beta1)
b2 = pm.Beta.dist(alpha=alpha2, beta=beta2)
mix = pm.Mixture("mix", w=[1.0, w], comp_dists=[b1, b2])
请注意,使用dist
ClassMethod时,省略了名称字符串。