我试着用一个负二项混合来拟合PyMC。 我好像做错了什么,因为预测值看起来和输入数据不太一样。 问题可能出在负二项式参数的先验中。 有什么建议吗?在
from sklearn.cluster import KMeans
import pymc as mc
n = 3 #Number of components of the mixture
ndata = len(data)
dd = mc.Dirichlet('dd', theta=(1,)*n)
category = mc.Categorical('category', p=dd, size=ndata)
kme = KMeans(n) # This is not needed but it is to help convergence
kme.fit(data[:,newaxis])
alphas = mc.TruncatedNormal('alphas', kme.cluster_centers_[:,0], 0.1, a=0. ,b=100000 ,size=n)
means = mc.TruncatedNormal('means', kme.cluster_centers_[:,0],0.1,a=0.0 ,b=100000, size=n)
@mc.deterministic
def mean(category=category, means=means):
return means[category]
@mc.deterministic
def alpha(category=category, alphas=alphas):
return alphas[category]
obs = mc.NegativeBinomial('obs', mean, alpha, value=data, observed = True)
predictive = mc.NegativeBinomial('predictive', mean, alpha)
model = mc.Model({'dd': dd,
'category': category,
'alphas': alphas,
'means': means,
'predictive':predictive,
'obs': obs})
mcmc = mc.MCMC( model )
mcmc.sample( iter=n_samples, burn=int(n_samples*0.7))
您已经正确地实现了三种分布混合的贝叶斯估计,但是MCMC模型给出了错误的值。在
问题是}中的参数在
category
没有足够快地收敛,means
、alphas
和{category
决定哪些点属于哪个分布之前偏离了好值。在通过可视化可以看出
^{pr2}$category
的后面部分是错误的:期望最大化是稳定潜在变量的经典方法,但您也可以使用快速和脏k-均值拟合的结果来为MCMC提供初始值:
然后估计值收敛到合理的值。在
{2美元^
对于alpha之前的版本,您可以对它们使用相同的分布:
这个问题并不局限于负二项分布;正态分布的Dirichlet混合以同样的方式失败;它是由于具有高维的分类分布,MCMC不能有效地进行优化。在
相关问题 更多 >
编程相关推荐