给定N个事件中每个事件的概率,如何确定0到N事件发生的概率?

时间:2016-05-16 19:21:20

标签: algorithm matlab recursion probability

第一次在这里发帖,所以如果我弄错了某些东西让我知道,我会非常乐意解决它!

给定N个事件,每个事件都有一个发生的个体概率(从0到100%),我想确定一起发生的那些事件的0到N的概率。

例如,如果我有事件1,2,3,...,N和5(E1,E2,E3 ......,EN),其中特定事件发生的个别概率如下:

  • E1 = 30%发生概率
  • E2 =发生概率为40%
  • E3 =发生概率为50%

  • ...

  • EN = x%发生概率

我想知道拥有的可能性:

  • 这些事件均未发生
  • 发生这些事件中的任何一个
  • 发生任何其中两项事件
  • 发生了这些事件中的任何三个
  • ...
  • 发生了所有这些事件

据我所知,发生0事件的是(1-E1)(1-E2)...(1-EN),并且发生所有N个事件的是E1 * E2 * ... * E3。但是,我不知道如何计算其他可能性(1到N-1事件发生)。

我一直在寻找一些可以解决这个问题的递归算法(二项式化合物分布),但我没有找到任何明确的公式来做到这一点。想知道你们有没有人可以提供帮助!

提前致谢!

编辑:事件确实独立

5 个答案:

答案 0 :(得分:1)

听起来像泊松二项式 wikipedia link

这是一个明确的递归公式,但要注意数值稳定性。 enter image description here

,其中

enter image description here

答案 1 :(得分:0)

您需要计算自己的Pascal三角形版本,并在每个位置计算概率(而不是计数)。第0行将是单个数字1.00;第1行由两个值组成,P(E1)和1-P(E1)。在其下方,在行k中,每个位置是P(Ek) [右上方输入] +(1-P(Ek)) [左上方输入]。我建议使用一个低三角矩阵,如:

1.00
0.30 0.70
0.12 0.46 0.42  # These are 0.3*0.4 | 0.3*0.6 + 0.7*0.4 | 0.7*0.6
0.06 0.29 0.44 0.21  # 0.12*0.5 | 0.12*0.5 + 0.46*0.5 | ...

看看它是如何工作的?在矩阵M的数组/矩阵表示法中,给定了向量P中的事件概率,这看起来像

M[k, i] = P[k] * M[k-1, i] +
          (1-P[k]) * M[k-1, i] + P[k] * M[k-1, i-1]

以上是一个很好的递归定义。请注意我之前的"右上角"下矩阵表示法中的引用只是上面的一行;左上角恰好是:行k-1,列i-1。

当你完成时,矩阵的底行将是获得事件的N,N-1,N-2,... 0的概率。如果你想要这些概率的相反顺序,那么只需切换系数P [k]和1-P [k]

这会让你走向解决方案吗?

答案 2 :(得分:0)

以下递归程序应该可以正常工作。

function ans = probability_vector(probabilities)
    if len(probabilities) == 0
        % No events can happen.
        ans = [1];
    elseif len(probabilities) == 1
        % 0 or 1 events can happen.
        ans = [1 - probabilities[1], probabilities[1]];
    else
        half = ceil(len(probabilities)/2);
        ans_half1 = probability_vector(probabilities[1: half]);
        ans_half2 = probability_vector(probabilities[half + 1: end]);
        ans = convolve(ans_half1, ans_half2)
    end
    return
end

如果p是概率向量,则p[i+1]是事件发生i的概率。

请参阅http://matlabtricks.com/post-3/the-basics-of-convolution,了解执行工作的神奇conv运算符。

答案 3 :(得分:0)

经过大量的研究和这里的答案的一些帮助,我想出了以下代码:

function [ prob_numSites ] = probability_activationSite( prob_distribution_site )

N = length(prob_distribution_site); % number of events
notProb = 1 - prob_distribution_site; % find probability of no occurrence
syms x; % create symbolic variable
prob_number = 1; % initializing prob_number to 1

for i = 1:N
    prob_number = prob_number*(prob_distribution_site(i)*x + notProb(i));
end

prob_number_polynomial = expand(prob_number); % expands the function into a polynomial
revProb_numSites = coeffs(prob_number_polynomial); % returns the coefficients of the above polynomial (ie probability of 0 to N events, where first coefficient is N events occurring, last coefficient is 0 events occurring)
prob_numSites = fliplr(revProb_numSites); % reverses order of coefficients

这会产生一定数量的单个事件发生的概率,并返回0到N事件发生概率的数组。

This回答很多)。

答案 4 :(得分:0)

这些答案似乎都不起作用/对我来说是可以理解的,因此我对其进行了计算并使用python自行编写:


def combin(n, k):
   if k > n//2:
       k = n-k
   x = 1
   y = 1
   i = n-k+1
   while i <= n:
       x = (x*i)//y
       y += 1
       i += 1
   return x

# proba being the probability of each of the N evenments, each being different from one another.

for i in range(N,0,-1):
    print(i)
    if sums[i]> 0:
        continue
    print(combin(N,i))
    for j in itertools.combinations(proba, i):
        sums[i]+=np.prod(j) 
for i in range(N,0,-1):
    for j in range(i+1,N+1):
        icomb = combin(j,i)
        sums[str(i)] -= icomb*sums[str(j)]

数学并不简单:

让$ C_ {w_n} $为所有无序集合$(i,j,k ... n)$ 的集合

其中$ i,j,k ... n \ in w $

$ Co(i,proba)= sum {C_ {w_i}}-sum_ {u from i + 1..n} {(u \ choose i) sum {C_ {w_u} }} $ *

$ Co(i,P)$是在给定$ P = {p_i ... p_n} $(每个事件的伯努利概率)的情况下发生i个事件的概率。