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))