【问题标题】:xor: N things with variable probabilitiesxor:N个具有可变概率的事物
【发布时间】:2020-10-15 04:34:45
【问题描述】:

原谅我;我是一名编码员,而不是一名数学家,所以我向我自己的堆栈提出了这个问题。我正在尝试减少一系列概率(0-1),比如说[.1,.3,.5] 来查找:

  1. 所有这些发生的可能性(简单的乘法,我们称这个函数为ANDprobs.reduce((m,p)=>p*m,1)),

    1.1 这个可以写

  2. 其中任何一个发生(一减去没有发生1 - probs.reduce((m,p)=>m*(1-p),1),称之为OR),并且

    2.1 这个可以写成

  3. XOR 只有一个,不多也不少,发生。起初我认为这很简单,因为如果只有两个输入,那么只有一个发生的机会应该是 OR 减去 AND。但是当我把这个作为一个超过两个值的数组猛烈抨击时,正常的 XOR 逻辑似乎解体了。

    3.1 这可以写成(详细)

我是否需要得到“OR”,然后将所有可能的 AND 场景迭代减法相乘? 或者是否有一个非迭代公式可以找出列表中恰好一个概率的总概率超过两个?

0,0,0 在我的情况下应该是 0。 0,.4.0 应该只产生一个发生的 0.4。 1,.4,0 应该产生 0.6。我知道.5,.5 应该有 0.25 的机会只发生一次。但我真的不知道如何计算只有一个.5,.5,.5 的机会,而不用指望我的手指。我的想法是,我必须遍历每个概率,并从中减去任何其他概率(OR 数组的其余部分),然后OR 最终结果......但这是推测性的。这似乎非常奇怪和低效。我不敢相信这会是一个 NP-Hard 问题,但这是我不熟悉的事情的一个角落......

如果可能,请以视觉、逻辑或程序化的方式回答,而不是纯数学...

** 在此处编辑:我不需要说明数组中的 特定 元素对其他元素独占的确切概率;我试图找出其中任何一个是排他性的一般概率。 **

** 编辑。这就是我现在所拥有的。我排除了每个人的所有其他可能性。这是最快的方法吗?... *


function And(probs) {
        return (probs.reduce((m,p)=>p*m,1));
    }
    function Or(probs) {
        return (1 - probs.reduce((m,p)=>m*(1-p),1));
    }
    function Xor(probs) {
        let _exclusiveProbabilities = [];
        for (let k=0; k < probs.length; k++) {
            let _others = [];
            for (let j = 0; j < probs.length; j++) {
                if (j != k) {
                    _others.push(probs[j]);
                    console.log(k,'pushed',probs[j]);
                }
            }
            const _anyOtherProb = Or(_others);
            _exclusiveProbabilities.push(probs[k] * (1 - _anyOtherProb));
        }
        return (Or(_exclusiveProbabilities)); 
    }

** 编辑。不,这对两个人来说很好,但对三个人不起作用。 **

【问题讨论】:

  • 是的 - 谢谢。编辑上述。我的大脑快炸了。
  • 我认为这确实更适合math.stackexchange.com,但无论如何,解决此类问题的方法是用合取和取反的形式表达逻辑运算,然后应用基本规则。我的论文 (riso.sourceforge.net/docs/dodier-dissertation.pdf) 在 C.3.11 节中推导出了 XOR 的公式。该公式可能存在于其他地方,但无论如何我知道它就在那里。我想你想要Eq。 C.25.
  • 啊,这太棒了,但我不知道如何阅读符号。 Pr(S1 ⊕S2 ⊕···⊕Sm) = Pr(Sm)+Pr(S1 ⊕···⊕Sm−1)(1−2Pr(Sm))(C.24) ...做“m”暗示你必须迭代这个系列?
  • 对,您可以通过 C.25 从 p0 = 0 迭代到 pm = Pr(S1 ⊕S2 ⊕···⊕Sm) 其中 m 是项数。在我的符号中看起来像 S = x 在你的符号中。 P(Sk) = 数组 p 的第 k 个元素(从 1 开始索引)。注意:我之前没有提到的一个重要假设是 S1,...,Sm 都是独立的。如果它们不是独立的,可能仍然可以得出一个结果,但这将取决于对各种 Sk 相互依赖的了解。

标签: javascript math


【解决方案1】:

假设您有三个概率,我们称之为 A、B 和 C。

A 是唯一发生的事件的概率是 A * (1-B) * (1-C)。换句话说,在这种情况下,A发生了,但B没有发生,C也没有发生。

但是,当然有可能 B 是唯一成功的事件,或者 C 是成功的事件。我们需要将所有这些情况的概率加在一起。

因此,我们将需要遍历所有事件,并计算仅发生该事件(而所有其他事件都失败)的概率,然后计算总和。

对于三个事件的情况,这将是: ( A * (1-B) * (1-C) ) + ( (1-A) * B * (1-C) ) + ( (1-A) * (1-B) * C )

如果总共有 N 个事件,那么这个表达式中总共会有 N^2(N 平方)项。

【讨论】:

  • 谢谢。这是一个非常简洁的解释。所以一个问题......添加原始概率值然后对变量的数量进行平方是非常......违反直觉的。不是我猜到的。为什么?我试图一一找到所有 XOR 值,然后得到它们的总 OR,但这不起作用。
  • @joshstrike 是您寻找“或”概率的最初目标,而您正在将“xor”视为实现目标的一种方式?
  • 谢谢。这就是我最终实施的。看起来像一个前额拍板,但我不知何故认为必须有一种无需迭代的方法。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2021-10-12
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多