如何在PyMC3中正确定义Beta分布的混合

时间:2017-09-12 11:13:55

标签: python pymc pymc3 mcmc

我正在尝试使用来自PyMC3Mixture使用两个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'。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

PyMC3附带一个pymc3.tests模块,其中包含有用的示例。通过在该目录中搜索单词“mixed”,我找到了this example

Mixture('x_obs', w,
        [Normal.dist(mu[0], tau=tau[0]), Normal.dist(mu[1], tau=tau[1])],
        observed=self.norm_x)

请注意,classmethod dist已被调用。谷歌搜索“pymc3 dist classmethod”导致这个doc page解释

  

...每个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时,省略名称字符串。