PyMC中的多项分布

时间:2014-05-27 00:53:34

标签: python numpy bayesian pymc multinomial

我是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.valuerv.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的后验概率分布(我假设最初是统一的)

1 个答案:

答案 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。