我是pymc的新手。我已经在github上阅读了所需的东西并且一直很好,直到我遇到这个问题。 我想制作一个多项随机变量的集合,我可以稍后使用mcmc进行采样。但我能做的最好的就是
rv = [ Multinomial("rv", count[i], p_d[i]) for i in xrange(0, len(count)) ]
for i in rv:
print i.value
i.random()
for i in rv:
print i.value
但由于我希望能够拨打rv.value
和rv.random()
,因此无法取消,否则我将无法从中进行采样。
count是非整数的列表,每个整数表示该分布的n值,例如。可能的计数可以是[26, 39, 20, 10]
p_d是列出凹痕概率的列表。例如,可能的p_d可以是[[0.7, 0.3], [0.5, 0.1, 0.4], [0.4, 0.6], [0.8, 0.2]]
for循环没用。他们只是表明组件是多项随机变量,但我认为我不能使用mcmc组件来获得后验分布。我需要一些方法来使用mcmc和rv。
如果有人可以在pymc中告诉我一些像numpy.array()(将列表转换为numpy数组)这样的函数,可以将列表转换为我想要的东西,那将是完美的。 (对不起,我无法用科学术语来表达它,但我尽力使自己变得清晰) 如果有人需要更多信息,请告诉我。
编辑1
我有几个游戏的数据,例如[8, 8, 10]
。它表示当这个游戏被玩26次时,P1(玩家1)获得A1(动作1)8次,A2 8次,A3 10次。
(在不同的游戏中可以有不同的动作。在这个结果为[8, 8, 10]
的例子中,有3个动作)
我有大约200个这样的数据(以list / numpy数组的形式)
我认为Multinomial发布最能描述数据。
所以我写了一个确定性函数,给定一个均匀分布的随机变量tau
生成这些行为的概率分布,例如,在这种情况下,说[0.16, 0.28, 0.56]
你知道,我有200个这样的列表,每个列表都表示该游戏中的动作的概率分布。我还有一个包含200个整数(可能不同)的列表,每个整数表示玩游戏的次数(我通过对数据进行求和获得,例如,数据[8, 8, 10,]
的游戏被播放了26次)。
现在给出观察到的数据(200个列表的列表,例如[[8, 8, 10], [0, 0, 0], ....., [12, 3]]
),我想绘制tau的后验概率分布(我假设最初是统一的)
答案 0 :(得分:1)
认为你想要这样的东西:
from pymc import *
p_d = [[0.7, 0.3], [0.5, 0.1, 0.4], [0.4, 0.6], [0.8, 0.2]]
count =[26, 39, 20, 10]
rv = [ Multinomial("rv"+str(i), count[i], p_d[i]) for i in xrange(0, len(count)) ]
m = MCMC(rv)
m.sample(100)
print m.trace('rv0')[:]
还要确保安装了pymc2.3而不是3。