Python 如何更新概率矩阵

Python 如何更新概率矩阵,python,algorithm,probability,bayesian,Python,Algorithm,Probability,Bayesian,我试图找到一个可以更新概率的函数 假设有三名玩家,他们每人从篮子里拿出一个水果:[“苹果”、“橘子”、“香蕉”] 我将每个玩家拥有每个水果的概率存储在矩阵中(如下表所示): 苹果 橙色 香蕉 玩家1 0.3333 0.3333 0.3333 玩家2 0.3333 0.3333 0.3333 玩家3 0.3333 0.3333 0.3333 这里是我将如何处理这个问题的方法-我还没有解决这个问题,但是在你的例子中它似乎是好的 假设每次更新的形式为“X,Y有概率p’”,用delta p-p标记元素

我试图找到一个可以更新概率的函数

假设有三名玩家,他们每人从篮子里拿出一个水果:
[“苹果”、“橘子”、“香蕉”]

我将每个玩家拥有每个水果的概率存储在矩阵中(如下表所示):


苹果 橙色 香蕉 玩家1 0.3333 0.3333 0.3333 玩家2 0.3333 0.3333 0.3333 玩家3 0.3333 0.3333 0.3333
这里是我将如何处理这个问题的方法-我还没有解决这个问题,但是在你的例子中它似乎是好的

假设每次更新的形式为“X,Y有概率p’”,用delta p-p标记元素X,Y,其中p是旧概率。现在,将增量按比例重新分布到行中所有未标记的元素,然后是列,用自己的增量标记每个脏元素,并标记第一个干净元素。继续,直到没有脏的条目

0.5   0.5   0.0
0.0   0.5   0.5
0.5   0.0   0.5

Belief: 2,1 has probability zero.

0.5   0.0*  0.0    update 2,1 and mark dirty
0.0   0.5   0.5    delta is 0.5
0.5   0.0   0.5

1.0*  0.0'  0.0    distribute 0.5 to row & col
0.0   1.0*  0.5    update as dirty, both deltas -0.5
0.5   0.0   0.5

1.0'  0.0'  0.0    distribute -0.5 to rows & cols
0.0   1.0'  0.0*   update as dirty, both deltas 0.5
0.0*  0.0   0.5

1.0'  0.0'  0.0    distribute 0.5 to row & col
0.0   1.0'  0.0'   update as dirty, delta is -0.5
0.0'  0.0   1.0*

1.0'  0.0'  0.0    distribute on row/col
0.0   1.0'  0.0'   no new dirty elements, complete
0.0'  0.0   1.0'
在您的第一个示例中:

1/3   1/3   1/3
1/3   1/3   1/3
1/3   1/3   1/3

Belief: 3,1 has probability 0

1/3   1/3   0*     update 3,1 to zero, mark dirty
1/3   1/3   1/3   delta is 1/3
1/3   1/3   1/3

1/2*  1/2*  0'    distribute 1/3 proportionally across row then col
1/3   1/3   1/2*  delta is -1/6
1/3   1/3   1/2*

1/2'  1/2'  0'    distribute -1/6 proportionally across row then col
1/4*  1/4*  1/2'  delta is 1/12
1/4*  1/4*  1/2'

1/2'  1/2'  0'    distribute prportionally to unmarked entries
1/4'  1/4'  1/2' no new dirty entries, terminate
1/4'  1/4'  1/2'
您可以通过将条目与关联的增量一起插入队列和哈希集中,将条目标记为脏条目。队列和哈希集中的条目都是脏的。仅哈希集中的条目是干净的。处理队列,直到条目用完为止


我没有举一个分配不均的例子,但关键是按比例分配。除非有新的信念,否则带有0的条目永远不会变为非零。

不幸的是,没有已知的好的解决方案

我应用贝叶斯推理的方法是存储一个可能性 矩阵而不是概率矩阵。(事实上我会去商店 记录可能性以防止下溢,但这是一种实现 我们可以从矩阵开始

苹果 橙色 香蕉 1 1. 1. 1. 2 1. 1. 1. 3 1. 1. 1. 检查此文档:

(S.Ganzfried,T.Sandholm,在《自主智能体和多智能体系统国际会议》(AAMAS)(2015年)第37-45页)中)初始条件:p(苹果)=p(橙色)=p(香蕉)=1/3

玩家1做了X。我们知道,如果玩家1有一个苹果,他做X的概率为80%。如果他有一个橘子,50%的佣金。如果他有一根香蕉的话,10%的折扣

p(X |苹果)=0.8 p(x |橙色)=0.5 p(x |香蕉)=0.1

因为苹果、橘子和香蕉的概率都是1/3,所以p(x)=1/3*1.4)~0.46666

回忆贝叶斯定理:p(a | b)=p(b | a)*p(a)/p(b)

因此p(苹果x)=p(苹果x)*p(苹果)/p(x)=0.8*(1/3)/0.466666~57.14%

类似地,p(橙色| x)=0.5*(1/3)/0.466666~35.71%

p(香蕉x)=0.1*(1/3)/0.466666~7.14%

以你为例:

probabilities = [
    [0.25, 0.25, 0.50],
    [0.25, 0.50, 0.25],
    [0.50, 0.25, 0.25],
]

# Player 1's 
reach_probability = [1.0, 0.5, 0.5]

new_probabilities = [
    [0.4, 0.2, 0.4],
    [0.2, 0.5, 0.3],
    [0.4, 0.3, 0.3],
]

p(x) = 0.25 * 1.0 + 0.25 * 0.5 + 0.5 * 0.5 = 0.625
p(a|x) = p(x|a) * p(a) / p(x) = 1.0 * 0.25 / 0.625 = 0.4
p(b|x) = p(x|b) * p(b) / p(x) = 0.5 * 0.25 / 0.625 = 0.2
p(c|x) = p(x|c) * p(c) / p(x) = 0.5 * 0.50 / 0.625 = 0.4
如所愿。每列的其他条目只需按比例缩放即可获得1.0的列和

例如,在第1列中,我们将其他条目乘以(1-0.4)/(1-0.25)。这需要0.25->0.2和0.50->0.40。其他列也是如此

new_probabilities = [
    [0.4, 0.200, 0.4],
    [0.2, 0.533, 0.3],
    [0.4, 0.266, 0.3],
]
如果玩家2以相同的条件概率计算y,我们得到:

p(y) = 0.2 * 1.0 + 0.533 * 0.5 + 0.3 * 0.5 = 0.6165
p(a|y) = p(y|a) * p(a) / p(y) = 1.0 * 0.2 / 0.6165 = 0.3244
p(b|y) = p(y|b) * p(b) / p(y) = 0.5 * 0.533 / 0.6165 = 0.4323
p(c|y) = p(y|c) * p(c) / p(y) = 0.5 * 0.266 / 0.6165 = 0.2157

这是一个非常有趣的问题。我曾在贝叶斯信念网络的背景下研究过“它不是X”形式的证据。“它不是X”证据表示为一个似然函数,对于X为零,对于其他任何东西为1。其效果正如您所描述的,概率矩阵中的某些元素被零击垮。看看你的程序,我不知道如何修复它,但是如果你考虑从P(X,不是X)计算后验P(不是X |它不是X)和可能性,你应该能够计算出正确的计算方法。保持这些东西是不容易的,尽管一旦你把它整理出来,计算就很简单了。我的建议是看看贝叶斯推理和信念网络。这将是一个极大的夸张,但是你将能够计算出这里需要的简单计算。我不理解第一个例子<代码>[1 0 1]reach proba。所以玩家1可以有两个水果。然而,新矩阵的第一行是
[100]
@Damien想象一下,我们可以问玩家1他会如何处理每个水果。第一个数字是当他有一个苹果时,他会做X的百分比,第二个是橙色<代码>[1,1,1]意味着,例如,无论水果玩家1拥有什么,他都会在100%的时间里做X。我不理解的是结果,即矩阵的第一行。我认为如果我可以从“X,Y有概率p”的形式的知识开始,这确实是正确的。我想我没有这个。我将更新我的问题,使之更清楚,然后再仔细考虑你的答案。这似乎很有希望。谢谢。我一开始以为第一行可以通过将到达概率和第一行相乘来计算。然后重新规范它。然后我们可以得到“X,Y有概率p”形式的信息。但是,正如较难的示例所示,这样做是不正确的。回答您关于分解更新的评论:我认为没有办法分解更新。@Hadus,我看到您的更新似乎在成倍增加。。。因此,在某种意义上,您有机会将每个非零条目更新为任何其他有效值。您的更新可以首先缩放,以便结果保持行的总和为1。然后,我们需要找到一个等效的单次更改更新序列,它给出相同的结果。这可能并不简单。我可以用手算出n=3的情况,但这很难看。我想知道你是否能把整行都设置好,然后把整行都标记为脏的。我想说的是,沿着第一行相乘甚至不能给出正确的比率,但我不确定如果我们继续跟踪脏的数据,它是否正确。我将尝试你的答案“首先进行缩放,使结果保持行的和为1。”然后看看会发生什么:)我想这可能是NP难的。事实上,我需要这个矩阵来对更新后可能出现的“世界”进行采样。能够