【发布时间】:2020-10-15 04:34:45
【问题描述】:
原谅我;我是一名编码员,而不是一名数学家,所以我向我自己的堆栈提出了这个问题。我正在尝试减少一系列概率(0-1),比如说[.1,.3,.5] 来查找:
-
所有这些发生的可能性(简单的乘法,我们称这个函数为
AND:probs.reduce((m,p)=>p*m,1)), -
其中任何一个发生(一减去没有发生
1 - probs.reduce((m,p)=>m*(1-p),1),称之为OR),并且 -
XOR只有一个,不多也不少,发生。起初我认为这很简单,因为如果只有两个输入,那么只有一个发生的机会应该是OR减去AND。但是当我把这个作为一个超过两个值的数组猛烈抨击时,正常的 XOR 逻辑似乎解体了。
我是否需要得到“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