Python PyMC3多元混合模型:约束组件为非空

Python PyMC3多元混合模型:约束组件为非空,python,theano,mcmc,pymc3,mixture-model,Python,Theano,Mcmc,Pymc3,Mixture Model,我在pymc3中实现了多元高斯回归的个性化混合,并遇到了一个组件为空的问题。在参考了之后,我尝试使用单变量法线来实现模型,但是我已经失败了 我尝试了几种策略来约束每个组件为非空,但都失败了。下面的代码中显示了这些。我的具体问题是:使用pymc3约束多元高斯混合中所有成分为非空的最佳方法是什么? 请注意,下面代码中的尝试#1来自,在这里不起作用 您可以复制我使用的合成数据 …表示组件为空,因为精度矩阵具有形状(0,0) 第三种方法实际上解决了空组件问题,但给出了非常奇怪的推理行为。我选择了一个基于

我在
pymc3
中实现了多元高斯回归的个性化混合,并遇到了一个组件为空的问题。在参考了之后,我尝试使用单变量法线来实现模型,但是我已经失败了

我尝试了几种策略来约束每个组件为非空,但都失败了。下面的代码中显示了这些。我的具体问题是:使用
pymc3
约束多元高斯混合中所有成分为非空的最佳方法是什么?

请注意,下面代码中的尝试#1来自,在这里不起作用

您可以复制我使用的合成数据

…表示组件为空,因为精度矩阵具有形状
(0,0)

第三种方法实际上解决了空组件问题,但给出了非常奇怪的推理行为。我选择了一个基于痕迹图的老化,并稀释到每10个样品。样本仍然具有高度的自相关性,但比不进行细化要好得多。在这一点上,我对样本的Z值求和,这就是我得到的结果:

In [3]: with gmreg:
    step1 = pm.Metropolis(vars=[pi, beta, W])
    step2 = pm.ElemwiseCategoricalStep(vars=[Z], values=np.arange(K))
    tr = pm.sample(1000, step=[step1, step2])
   ...:     
 [-----------------100%-----------------] 1000 of 1000 complete in 258.8 sec

...

In [24]: zvals = tr[300::10]['Z']

In [25]: np.array([np.bincount(zvals[:, n]) for n in range(nusers)])
Out[25]: 
array([[ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70]])

因此,出于某种原因,每个示例的所有用户都被分配到最后一个集群。

我遇到了类似的问题。类似这样的东西适用于多元高斯混合模型。至于这是否是最好的,这肯定是我找到的最好的解决方案

pm.Potential('pi_min_potential', T.switch(
                                           T.all(
                                                [pi[i, 0] < 0.1 for i in range(K)]), -np.inf, 0))
pm.Potential('pi\u min\u Potential',T.switch(
T.all(
[pi[i,0]<0.1(对于范围(K)]内的i,-np.inf,0))

这里的关键是,你需要考虑每一个低于你的截止值的潜力。此外,您应该调整
pi
分布的
形状,如注释中所述。这将影响您在
T.switch
调用(在
pi[i,0]
上)中的索引。

这方面运气好吗?我只是想弄清楚如何使用无限簇……除了数值不精确之外,
pm.Dirichlet('pi',a=alpha,shape=K)
中的所有条目不都应该为非零吗?对于所有i项,对Dirichlet的支持都是0pm.Dirichlet('pi',a=alpha,shape=K)
中,我认为您需要
pm.Dirichlet('pi',a=alpha,shape=(len(alpha),K))
。。。或者它可能是pm.Dirichlet('pi',a=alpha,shape=(K,len(alpha))
;我忘了。
In [3]: with gmreg:
    step1 = pm.Metropolis(vars=[pi, beta, W])
    step2 = pm.ElemwiseCategoricalStep(vars=[Z], values=np.arange(K))
    tr = pm.sample(1000, step=[step1, step2])
   ...:     
 [-----------------100%-----------------] 1000 of 1000 complete in 258.8 sec

...

In [24]: zvals = tr[300::10]['Z']

In [25]: np.array([np.bincount(zvals[:, n]) for n in range(nusers)])
Out[25]: 
array([[ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70],
       [ 0,  0, 70]])
pm.Potential('pi_min_potential', T.switch(
                                           T.all(
                                                [pi[i, 0] < 0.1 for i in range(K)]), -np.inf, 0))