pymc3:截断法线混合

问题描述

我想在 pymc3 中混合两个 Truncatednormal 分布。

我正在尝试修改piece of documentation。请参阅泊松示例 #2。

import pymc3 as pm
import numpy as np

x_obs = [x for x in np.random.randn(250) if 1>x>0] + [x for x in np.random.randn(250) if 1.2>x>0.2]
x = np.array(x_obs)
with pm.Model() as model:
    w = pm.Dirichlet("w",[1,1])
    mu1 = pm.Truncatednormal("mu1",mu=x.mean(),sigma=1,lower=0,upper=1)
    tau1 = pm.Gamma("tau1",mu=1/x.std()**2,sigma=1.0)
    mu2 = pm.Truncatednormal("mu2",upper=1)
    tau2 = pm.Gamma("tau2",sigma=1.0)
    tn1 = pm.Truncatednormal.dist("tn1",mu=mu1,tau=tau1,upper=1)
    tn2 = pm.Truncatednormal.dist("tn2",mu=mu2,tau=tau2,upper=1)
    like = pm.Mixture(name="like",w=w,comp_dists=[tn1,tn2],observed = x)

我得到的错误是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-0287db35d04c> in <module>
      5 #     mu2 = pm.Truncatednormal("mu2",upper=1)
      6 #     tau2 = pm.Gamma("tau2",sigma=1.0)
----> 7     tn1 = pm.Truncatednormal.dist("tn1",8                                   mu=mu1,9                                   tau=tau1,~/.conda/envs/user_env/lib/python3.9/site-packages/pymc3/distributions/distribution.py in dist(cls,*args,**kwargs)
    128     def dist(cls,**kwargs):
    129         dist = object.__new__(cls)
--> 130         dist.__init__(*args,**kwargs)
    131         return dist
    132 

TypeError: __init__() got multiple values for argument 'mu'

将混合模型应用于截断法线的正确方法是什么?

解决方法

您无需为发行版指定名称。作为第一个参数传递给 tn1 的字符串 pm.TruncatedNormal.dist 被解释为 mu (当你也传递一个命名的 mu 时,你会得到异常)。试试

tn1 = pm.TruncatedNormal.dist(mu=mu1,tau=tau1,lower=0,upper=1)

(以及相应的 tn2)。