PyMC中的MAP出现意外错误

时间:2014-06-05 00:47:41

标签: python distribution pymc mcmc multinomial

我不明白为什么MAP在同一场景中MCMC正常工作时会出错? 我写的是代码的相关部分。

tau = Uniform('tau', lower=0.01, upper=5, doc='tau') rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed =True) for i in xrange(0, len(count)) ] M = MAP([rv, tau]) M.fit() tau_hat = M.tau.value()

错误:属性错误:' MAP'对象没有属性' tau' (对于最后一行M.tau.value())

另一方面,如果我使用MCMC代替MAP,它可以正常工作:

m = MCMC([tau, rv]) m.sample(iter = 500) print m.trace('tau')

我想要后点具有最大概率的tau点估计,并将其与贝叶斯预测(我使用MCMC)进行比较

有关变量的一些信息:

prob_distribution是一个确定性函数,给定tau和其他一些信息返回每个游戏的预测概率分布列表。我有大约200个游戏,所以prob_distribution是200个列表的列表(每个列表包含该游戏的动作的概率分布,例如[0.4, 0.4, 0.2])类似地,count是200个数字的列表,count [i]表示我的次数{{玩了{1}}游戏。 data [i]是i th游戏的观察信息,例如,如果data [i] = th,count [i]将为26

附加说明

如果我包含以下行:

[10 10 6]

然后判断我是否使用

model = Model([rv, tau])M = MAP(model)

这给出了如下错误:

TypeError:hasattr():属性名称必须为字符串

有人可以解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:1)

在PyMC2中,MCMC对象将模型节点公开为实例变量,但MAP对象不公开。可能值得用pymc-devs提交功能请求。您可以通过用

替换最后一行来获取tau的MAP值
tau_hat = tau.value

此变通办法的完整最小示例如下:

from pymc import *

count = [10, 10]
prob_distribution = [[.5, .5], [.1, .2, .7]]
data = [[2, 8], [2, 3, 5]]

tau = Uniform('tau', lower=0.01, upper=5)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]
M = MAP([rv, tau])
M.fit()
tau_hat = tau.value

请注意,tau不会被此模型中的数据告知...