PyMC中的多项式分布

1 投票
1 回答
1724 浏览
提问于 2025-04-18 07:39

我刚开始接触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值,比如一个可能的count可以是[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组这样的数据(以列表或numpy数组的形式)。

我相信多项分布最能描述这些数据。

所以我写了一个确定性函数,给定一个均匀分布的随机变量tau,生成这些动作的概率分布,比如在这个例子中,可能是[0.16, 0.28, 0.56]

你看,我有200个这样的列表,每个列表表示该游戏中动作的概率分布。我还有一个包含200个整数的列表(可能不同),每个整数表示这场游戏被玩了多少次(我通过对数据求和得到,比如数据[8, 8, 10]表示这场游戏玩了26次)。

现在,给定观察到的数据(一个包含200个列表的列表,比如[[8, 8, 10], [0, 0, 0], ....., [12, 3]]),我想绘制tau的后验概率分布(我最初假设它是均匀分布的)。

1 个回答

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的版本。

撰写回答