PyMC中的负二项混合

时间:2014-06-29 10:40:08

标签: python statistics modeling pymc markov-chains

我试图在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))

1 个答案:

答案 0 :(得分:3)

您已经正确实现了三种分布混合的贝叶斯估计,但MCMC模型给出了错误的值。

问题是category收敛速度不够快,而meansalphasdd中的参数远离{{1}之前的良好值决定哪些点属于哪个分布。

category

通过可视化,您可以看到data = np.atleast_2d(list(mc.rnegative_binomial(100., 10., size=s)) + list(mc.rnegative_binomial(200., 1000., size=s)) + list(mc.rnegative_binomial(300., 1000., size=s))).T nsamples = 10000 的后验是错误的:

category

category posteriors of the input data, no initialization

期望最大化是稳定潜在变量的经典方法,但您也可以使用快速和肮脏的k-means拟合的结果来为MCMC提供初始值:

G = [data[np.nonzero(np.round(mcmc.trace("category")[:].mean(axis=0)) == i)]
    for i in range(0,3) ]
plt.hist(G, bins=30, stacked = True)

然后估计值会收敛到合理的值。

category posteriors using kmeans to initialize

对于您以前的alpha版,您可以对所有这些版本使用相同的版本:

category = mc.Categorical('category', p=dd, size=ndata, value=kme.labels_)

此问题并非特定于负二项分布; Dirichlet-正态分布的混合物以相同的方式失效;它源于具有高维分类分布,MCMC在优化方面效率不高。