我是 pymc 的新手并且很享受它,但遇到了一些非常奇怪的行为。我想用它来追踪移动的东西;按照教程,我设置了一些随机指标并尝试使用pymc.NormApprox()
它。fit()
似乎可以运行,但是当我尝试输出输出时,它给了我KeyError
。当我切换到使用pymc.MCMC
它时,它会运行 `sample() OK,但随后会破坏命名空间(Python 甚至忘记了如何退出())。
系统:Ubuntu 12.04,scipy numpy等安装,pymc通过easy_install安装;也从 git 尝试过。
重现代码:test.py::
import pymc
import numpy as np
x = pymc.MvNormal('x',mu=np.zeros(4),tau=np.eye(4))
@pymc.deterministic()
def y(x=x):
out = np.zeros(2)
out[0] = x[0]+x[2]
out[1] = x[1]+x[3]
return out
ymeas = pymc.MvNormal('ymeas',mu=y,tau=np.eye(2)*100000,value=20*np.ones(2),observed=True)
然后,在 shell 中运行 python 或 ipython::
import test
import pymc
foo = pymc.NormApprox(test)
foo.fit()
foo.mu[foo.x] # Fails - gives KeyError
foo._mu # I can see it OK if I break privacy rules
foo = pymc.MCMC(test)
foo.sample(10000) # runs OK
foo # fails - namespace is nuked
我期望看到的:
foo.mu[foo.x]
应该给我后部的正常近似值;我不应该收到 Key 错误,也不应该闯入foo._mu
相反,我得到:
>>> foo.mu[foo.x]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pymc-2.2-py2.7-linux-x86_64.egg/pymc/NormalApproximation.py", line 56, in __getitem__
tot_len += self.owner.stochastic_len[p]
KeyError: 9.9999517411499177
>>> foo._mu
array([ 9.99995174, 9.99997163, 10.0000485 , 10.00002837])
>>>
我还注意到文档字符串foo.mu
说N.mu(p1,p2)
但在线文档说N.mu[N.p1,N.p2]
。
至于后 MCMC 命名空间崩溃,它甚至忘记了如何退出()
此外,我可以确认我在运行不同安装(Enthought Python)的不同机器(MacBook Pro)上遇到了同样的问题。