假设我们在 X (例如X~高斯)和前向算子 y = f(x)上给出了先验。假设我们通过实验进一步观察到 y ,并且该实验可以无限期地重复。输出 Y 被假定为高斯(Y~高斯)或无噪声(Y~Delta(观察))。
如何根据观察结果持续更新我们对 X 的主观认知程度?我用PyMC试过以下模型,但似乎我错过了一些东西:
from pymc import *
xtrue = 2 # this value is unknown in the real application
x = rnormal(0, 0.01, size=10000) # initial guess
for i in range(5):
X = Normal('X', x.mean(), 1./x.var())
Y = X*X # f(x) = x*x
OBS = Normal('OBS', Y, 0.1, value=xtrue*xtrue+rnormal(0,1), observed=True)
model = Model([X,Y,OBS])
mcmc = MCMC(model)
mcmc.sample(10000)
x = mcmc.trace('X')[:] # posterior samples
后部不会收敛到 xtrue 。
答案 0 :(得分:7)
@ user1572508所使用的功能现在是名为stochastic_from_data()
或Histogram()
的PyMC的一部分。然后,该线程的解决方案变为:
from pymc import *
import matplotlib.pyplot as plt
xtrue = 2 # unknown in the real application
prior = rnormal(0,1,10000) # initial guess is inaccurate
for i in range(5):
x = stochastic_from_data('x', prior)
y = x*x
obs = Normal('obs', y, 0.1, xtrue*xtrue + rnormal(0,1), observed=True)
model = Model([x,y,obs])
mcmc = MCMC(model)
mcmc.sample(10000)
Matplot.plot(mcmc.trace('x'))
plt.show()
prior = mcmc.trace('x')[:]
答案 1 :(得分:5)
问题是你的函数$ y = x ^ 2 $不是一对一的。具体来说,因为当你对它进行平方时丢失了有关X符号的所有信息,所以无法从Y值中判断出最初是使用2还是-2来生成数据。如果在第一次迭代后为X创建跟踪的直方图,您将看到:
此分布有2种模式,一种为2(您的真实值),另一种为-2。在下一次迭代中,x.mean()将接近零(在双峰分布上取平均值),这显然不是你想要的。