【问题标题】:How to update a matrix of probabilities如何更新概率矩阵
【发布时间】:2021-06-10 01:27:07
【问题描述】:

我正在尝试寻找/找出一个可以更新概率的函数。

假设有三个玩家,每个人从篮子里拿出一个水果:["apple", "orange", "banana"]

我将每个玩家拥有每种水果的概率存储在一个矩阵中(如这张表):


apple orange banana
Player 1 0.3333 0.3333 0.3333
Player 2 0.3333 0.3333 0.3333
Player 3 0.3333 0.3333 0.3333

表格可以解释为某人 (S) 的信念,他不知道谁拥有什么。每一行和每一列的总和为 1.0,因为每个玩家都有一个水果,每个水果在其中一个玩家处。

我想根据 S 获得的一些知识更新这些概率。示例信息:

玩家 1 做了 X。我们知道,如果 玩家 1 有一个苹果,他有 80% 的概率会做 X。如果他有一个橙色,则为 50%。如果他有一个香蕉,则为 10%。

这可以更简洁地写成[0.8, 0.5, 0.1],我们称之为reach_probability


一个相当容易理解的例子是:

probabilities = [
    [0.5, 0.5, 0.0],
    [0.0, 0.5, 0.5],
    [0.5, 0.0, 0.5],
]

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

new_probabilities = [
    [1.0, 0.0, 0.0],
    [0.0, 1.0, 0.0],
    [0.0, 0.0, 1.0],
]

上面的例子很容易理解。


另一个例子:

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],
]

在我的用例中,使用模拟不是一种选择。我的概率矩阵很大。不确定计算这个的唯一方法是使用迭代算法还是有更好的方法。

我查看了贝叶斯的东西,不知道如何在这种情况下应用它。逐行更新它然后将差异按比例分散到以前的概率似乎很有希望,但我还没有设法让它正常工作。或许这根本不可能。

【问题讨论】:

  • 这是一个非常有趣的问题。我曾在贝叶斯信念网络的背景下处理过“它不是 X”形式的证据。 “它不是 X”的证据被表示为一个似然函数,对于 X 为零,对于其他任何东西都为 1。效果就像您描述的那样,概率矩阵中的某些元素被零破坏。查看您的程序,我不知道如何解决它,但是如果您考虑从 P(X, not X) 计算后验 P(not X | it is not X),您应该能够计算出正确的计算)(即,您开始时的情况)和可能性。
  • 保持这些东西直截了当并不容易,尽管一旦你把它整理好,计算就很简单了。我的建议是看看贝叶斯推理和信念网络。这将是巨大的矫枉过正,但您将能够计算出此处所需的简单计算。
  • 我不明白第一个例子。 [1 0 1] 到达概率。所以玩家 1 可以有两个水果。但是,新矩阵的第一行是[1 0 0]
  • @Damien 想象一下,我们可以问玩家 1 他会用每种水果做什么。第一个数字是当他有一个 apple 时他会做 X 的百分比,第二个是 orange...[1, 1, 1] 的意思是,例如,不管什么水果玩家 1 他会做 X 100% 的时间。
  • 我不明白的是结果,即矩阵的第一行

标签: python algorithm probability bayesian


【解决方案1】:

这是我将如何处理这个问题 - 还没有解决这是否也有问题,但在你的例子中似乎没问题。

假设每次更新的形式为“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 的条目永远不会变为非零。

【讨论】:

  • 我认为如果我可以从“X,Y 概率 p”形式的知识开始,这确实是正确的。我不认为我有这个。我将更新我的问题以使其更清晰,然后再仔细考虑您的答案。看起来很有希望。谢谢。
  • 一开始我以为第一行可以通过将到达概率和第一行相乘来计算。然后重新规范化它。然后我们可以得到“X,Y 有概率 p”形式的信息。但正如更难的例子所表明的那样,这样做是不正确的。
  • 回答您关于分解更新的评论:我认为没有办法分解更新。
  • @Hadus 我看到您的更新似乎在连续成倍增加......所以从某种意义上说,您有机会将每个非零条目更新为任何其他有效值。您的更新可以首先进行缩放,以使结果保持总和为 1 的行。然后,我们需要找到一个等效的单更改更新序列,它给出相同的结果。这可能并不简单。我可以用手算出 n=3 的情况,但它很难看。我想知道你是否不能只设置整行并将整行标记在一起。
  • 我的意思是,沿第一行相乘甚至不能给出正确的比率,但我不确定如果我们继续跟踪肮脏的情况,它是否会变得正确。我将尝试使用“首先缩放以使结果保持总和为 1 的行”来尝试您的答案。看看会发生什么:)
【解决方案2】:

很遗憾,没有已知的好的解决方案。

我应用贝叶斯推理的方式是存储可能性 矩阵而不是概率矩阵。 (实际上我会存储 防止下溢的对数似然,但这是一种实现 细节。)我们可以从矩阵开始

Apple Orange Banana
1 1 1 1
2 1 1 1
3 1 1 1

代表没有知识。您可以改用全 1/3 矩阵,但是 我用 1 来强调不需要标准化。申请一个 像玩家 1 那样更新,条件概率为 [0.8, 0.5, 0.1],我们只是将行元素相乘:

Apple Orange Banana
1 0.8 0.5 0.1
2 1 1 1
3 1 1 1

如果玩家 1 在相同的条件下独立地做 Y 概率,然后我们得到

Apple Orange Banana
1 0.64 0.25 0.01
2 1 1 1
3 1 1 1

现在,问题在于这些可能性与 具体结果的概率。我们只知道概率 特定匹配的大小与其矩阵的乘积成正比 条目。举个简单的例子,像

这样的矩阵
Apple Orange Banana
1 1 0 0
2 0 1 0
3 0 1 1

玩家 3 有橙色的条目是 1,但这个任务有 概率为 0,因为完成匹配的两种可能性 概率为 0。

我们需要的是 permanent, 它总结了每个匹配的可能性,以及每个匹配的次要 矩阵条目,它总结了每个匹配的可能性,使得 对应的赋值。不幸的是,我们不知道准确的 计算永久的算法,专家们对此表示怀疑 一个存在(问题是NP-hard,实际上是#P-complete)。这 已知近似采用马尔可夫链采样。

【讨论】:

  • 我在想这可能是 NP 难的。在进行了一些更新之后,我实际上需要这个矩阵来采样可能的“世界”。我们可以轻松地从可能性中采样吗?到目前为止,这看起来是最好的答案谢谢:)
  • @Hadus 有一个快速混合的马尔可夫链,所以如果近似值可以,那么你很幸运。有机会我会发布更多。
  • 是的,如果没有更好的方法,可以近似。对我来说,看永久是相当高水平的数学,所以如果有 python 库(或任何)可以做到这一点,那就太棒了。
  • @Hadus 嗯,我记错了。 “快速混合”是多项式,但指数是 7(!)。同时,Ryser 的公式将给出准确的评估,但需要时间 O(n 2^n)。我认为这两种方法对于维度 >1,000 的矩阵都不实用。
  • 那很不幸。谢谢你调查它。如果您可以更新您的答案以包括我认为获得赏金就足够了,除非其他人会找到某种方法使其发挥作用。
【解决方案3】:

查看此文档: Endgame Solving in Large Imperfect-Information Games∗

(S. Ganzfried、T. Sandholm,在自主代理和多代理系统国际会议 (AAMAS) (2015),第 37-45 页。)

【讨论】:

    【解决方案4】:

    初始条件:p(apple) = p(orange) = p(banana) = 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.466666666。

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

    所以 p(apple | x) = p(x | apple) * p(apple) / p(x) = 0.8 * (1/3) / 0.46666666 ~ 57.14%

    类似地 p(orange | x) = 0.5 * (1/3) / 0.46666666 ~ 35.71%

    和 p(banana | x) = 0.1 * (1/3) / 0.46666666 ~ 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
    

    【讨论】:

    • 好了,这看起来很不错。我会看看这在我的解决方案中有多实用,但这绝对是我所问问题的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 2021-05-11
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多