4

我编写了一个 PyMC 模型,用于使用(类似于这个问题中的那个)将 3 个法线拟合到数据中。

import numpy as np
import pymc as mc
import matplotlib.pyplot as plt

n = 3
ndata = 500

# simulated data
v = np.random.randint( 0, n, ndata)
data = (v==0)*(10+ 1*np.random.randn(ndata)) \
   + (v==1)*(-10 + 2*np.random.randn(ndata)) \
   + (v==2)*3*np.random.randn(ndata)

# the model
dd = mc.Dirichlet('dd', theta=(1,)*n)
category = mc.Categorical('category', p=dd, size=ndata)
precs = mc.Gamma('precs', alpha=0.1, beta=0.1, size=n)
means = mc.Normal('means', 0, 0.001, size=n)

@mc.deterministic
def mean(category=category, means=means):
    return means[category]

@mc.deterministic
def prec(category=category, precs=precs):
    return precs[category]

obs = mc.Normal('obs', mean, prec, value=data, observed = True)

model = mc.Model({'dd': dd,
              'category': category,
              'precs': precs,
              'means': means,
              'obs': obs})

M = mc.MAP(model)
M.fit()
# mcmc sampling
mcmc = mc.MCMC(model)
mcmc.use_step_method(mc.AdaptiveMetropolis, model.means)
mcmc.use_step_method(mc.AdaptiveMetropolis, model.precs)
mcmc.sample(100000,burn=0,thin=10)

tmeans = mcmc.trace('means').gettrace()
tsd = mcmc.trace('precs').gettrace()**-.5
plt.plot(tmeans)
#plt.errorbar(range(len(tmeans)), tmeans, yerr=tsd)
plt.show()

我从中采样数据的分布明显重叠,但有 3 个明显不同的峰(见下图)。将 3 个法线拟合到此类数据应该是微不足道的,我希望它能够在 99% 的 MCMC 运行中产生我从 (-10, 0, 10) 采样的平均值。 来自 3 个正态分布的数据 我期望的结果示例。这发生在十分之二的案例中。 MCMC 跟踪产生良好的拟合 10 个案例中有 6 个发生意外结果的示例。这很奇怪,因为在 -5 上,数据中没有峰值,所以我不能真正达到采样可能陷入的严重局部最小值(从 (-5,-5) 到 (-6,-4)应该提高合身性,等等)。 MCMC 跟踪产生不合适的结果

(自适应 Metropolis)MCMC 采样在大多数情况下卡住的原因可能是什么?有哪些可能的方法来改进它没有的抽样程序?

所以运行确实收敛,但并没有真正探索正确的范围。


更新: 使用不同的先验,我在 5/10 中得到正确的收敛(大约第一张图片),在另一个 5/10 中得到错误的收敛(大约第二张图片)。基本上,更改的行是下面的行,并删除了 AdaptiveMetropolis 步骤方法:

precs = mc.Gamma('precs', alpha=2.5, beta=1, size=n)
means = mc.Normal('means', [-5, 0, 5], 0.0001, size=n)
4

2 回答 2

3

你有什么特别想使用的原因AdaptiveMetropolis吗?我想香草MCMC不起作用,你得到了这样的东西:

在此处输入图像描述

是的,那不好。我可以发表一些评论。下面我使用了香草 MCMC。

  1. 您的means先前方差 ,0.001太大。这对应于大约 31 ( = 1/sqrt(0.001) ) 的标准偏差,这太小了。你真的强迫你的手段接近0。你想要一个更大的标准。偏差以帮助探索该地区。我将值降低到 0.00001 并得到了这个:

在此处输入图像描述

完美的。当然,我先验地知道真正的均值是 50,0 和 -50。通常我们不知道这一点,因此将该值设置得非常小总是一个好主意。

2. 你真的认为所有的法线都在 0 处排列,就像你mean之前建议的那样吗?(你将它们的平均值设置为 0)这个练习的重点是发现它们是不同的,所以你的先验应该反映这一点。就像是:

means = mc.Normal('means', [-5,0,5], 0.00001, size=n)

更准确地反映了你的真实信念。这实际上也有助于通过向 MCMC 建议手段应该在哪里来帮助收敛。当然,您必须使用您的最佳估计来得出这些数字(我在这里天真地选择了 -5,0,5)。

于 2013-10-01T12:58:40.797 回答
0

category问题是由变量的接受率低引起的。请参阅我对类似问题的回答。

于 2014-10-17T10:49:00.440 回答