PyMC中的负二项混合模型

1 投票
1 回答
1590 浏览
提问于 2025-04-18 11:28

我正在用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 个回答

3

你已经正确地实现了三种分布的贝叶斯估计,但MCMC模型给出的值看起来不太对。

问题在于,category的收敛速度不够快,而meansalphasdd这些参数在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的后验分布是否正确:

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)

输入数据的类别后验分布,没有初始化

期望最大化是一种经典的方法,用来稳定潜在变量,但你也可以使用快速的k均值算法的结果,给MCMC提供初始值:

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

这样估计的结果就会收敛到看起来合理的值。

使用k均值初始化的类别后验分布

对于你的alpha的先验分布,你可以对它们使用相同的分布:

alphas = mc.Gamma('alphas', alpha=1, beta=.0001 ,size=n)

这个问题并不是负二项分布特有的;Dirichlet混合的正态分布也会出现同样的问题;这是因为高维的分类分布让MCMC在优化时效率不高。

撰写回答