我正在尝试使用最大后验估计来估计速率随时间变化的泊松过程的速率。这是一个简化的例子,其速率线性变化(λ= ax + b):
import numpy as np
import pymc
# Observation
a_actual = 1.3
b_actual = 2.0
t = np.arange(10)
obs = np.random.poisson(a_actual * t + b_actual)
# Model
a = pymc.Uniform(name='a', value=1., lower=0, upper=10)
b = pymc.Uniform(name='b', value=1., lower=0, upper=10)
@pymc.deterministic
def linear(a=a, b=b):
return a * t + b
r = pymc.Poisson(mu=linear, name='r', value=obs, observed=True)
model = pymc.Model([a, b, r])
map = pymc.MAP(model)
map.fit()
map.revert_to_max()
print "a :", a._value
print "b :", b._value
这很好用。但我的实际泊松过程受到确定性值的限制。由于我无法将我的观察值与确定性函数相关联,因此我添加了一个正态随机函数,其观察值的方差很小:
import numpy as np
import pymc
# Observation
a_actual = 1.3
b_actual = 2.0
t = np.arange(10)
obs = np.random.poisson(a_actual * t + b_actual).clip(0, 10)
# Model
a = pymc.Uniform(name='a', value=1., lower=0, upper=10)
b = pymc.Uniform(name='b', value=1., lower=0, upper=10)
@pymc.deterministic
def linear(a=a, b=b):
return a * t + b
r = pymc.Poisson(mu=linear, name='r')
@pymc.deterministic
def clip(r=r):
return r.clip(0, 10)
rc = pymc.Normal(mu=r, tau=0.001, name='rc', value=obs, observed=True)
model = pymc.Model([a, b, r, rc])
map = pymc.MAP(model)
map.fit()
map.revert_to_max()
print "a :", a._value
print "b :", b._value
此代码产生以下错误:
Traceback (most recent call last):
File "pymc-bug-2.py", line 59, in <module>
map.revert_to_max()
File "pymc/NormalApproximation.py", line 486, in revert_to_max
self._set_stochastics([self.mu[s] for s in self.stochastics])
File "pymc/NormalApproximation.py", line 58, in __getitem__
tot_len += self.owner.stochastic_len[p]
KeyError: 0
关于我做错了什么的任何想法?
答案 0 :(得分:3)
By&#34; Capped&#34;你的意思是它是一个截断的泊松?这看起来就像你说的那样。如果它是左截断(这是更常见的),你可以使用TruncatedPoisson
分布,但由于你正在进行正确的截断,你不能(我们应该让它更通用!)。你正在尝试的东西不起作用 - 泊松对象没有clip()
方法。你可以做的是使用因素潜力。它看起来像这样:
@pymc.potential
def clip(r=r):
if np.any(r>10):
return -np.inf
return 0
这会将r
的值限制为小于10.有关Potential
类的信息,请参阅pymc docs。