jul*_*ohm 7 python probability mcmc pymc
假设我们在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
Run Code Online (Sandbox Code Playgroud)
后部没有收敛到xtrue.
@ user1572508的功能现在是PyMC的名称stochastic_from_data()
或名称的一部分Histogram()
.这个线程的解决方案然后变成:
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')[:]
Run Code Online (Sandbox Code Playgroud)
问题是你的函数$ y = x ^ 2 $不是一对一的.具体来说,因为当你对它进行平方时丢失了有关X符号的所有信息,所以无法从Y值中判断出最初是使用2还是-2来生成数据.如果在第一次迭代后为X创建跟踪的直方图,您将看到:
此分布有2种模式,一种为2(您的真实值),另一种为-2.在下一次迭代中,x.mean()将接近零(在双峰分布上取平均值),这显然不是你想要的.