请原谅,我是一个程序员,而不是数学家,所以我向我自己的堆栈提出这个问题。我试图减少一个概率数组(0-1),假设[.1,.3,.5]
找到:
1.所有这些发生的可能性(简单乘法,让我们称这个函数为AND
:probs.reduce((m,p)=>p*m,1)
),
1.1可以写成x1c 0d1x
1.其中任何一个发生(1减去没有发生1 - probs.reduce((m,p)=>m*(1-p),1)
,称之为OR
),以及
2.1可以写成
XOR
只有一个,不多也不少,其中发生。起初我认为这很简单,因为如果只有两个输入,那么只有一个发生的概率应该是OR
减去AND
。但是当我把它作为一个包含两个以上值的数组时,正常的XOR逻辑似乎瓦解了。
3.1这可以写成(冗长地)
我需要得到“或”,然后减去乘以 * 所有可能的与场景迭代?* 或者是否存在一个非迭代公式来找出一个长于两个的列表中的一个概率的总概率?0,0,0
在我的例子中应该是0。0,.4.0
应该只会产生一个0.4的事件。1,.4,0
应产生0.6。我知道.5,.5
应该产生0.25的机会,只有一个发生。但我真的不知道如何计算只有一个.5,.5,.5
的机会,而不是用手指计算。我的想法是,我必须循环遍历每个概率,并从中减去任何其他概率(OR
数组的其余部分),然后OR
最终结果......但这只是推测这似乎非常奇怪和低效。我不敢相信这会是一个NP难问题,但这是一个我不熟悉的角落…
请用视觉,逻辑或程序术语回答,如果可能的话,不要纯数学...
在此编辑:我不需要阐明数组中某个 * 特定 * 元素对其他元素独占的确切概率;我想找出其中任何一个是排他性的概率。
这就是我现在所拥有的。我排除了所有其他的可能性。这是最快的路吗?... *
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));
}
编辑。不,这对两个人很好,但对三个人不起作用。
2条答案
按热度按时间nkoocmlb1#
假设你有三种可能性,我们称之为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平方)个总项。
3okqufwl2#
如果每个事件发生的概率相同,比如
p
,并且有n
个事件,并且它们都是独立的,那么所有事件的XOR都有一个很好的封闭形式解决方案,这是一个n
次的多项式。这里:
(-1)^(k-1)
基于事件的数量(k)交替符号,这反映了对于为真的XOR,奇数个输入需要为真C(n, k)
是二项式系数“n选k”,并说明了从n
中选择k
事件的所有方式k * P^k
是k
事件发生的概率,(1-P)^(n-k)
是剩余事件不发生的概率。