【问题标题】:How to determine probability of 0 to N events occurring given probability of each of those N events?给定这 N 个事件的概率,如何确定 0 到 N 个事件发生的概率?
【发布时间】:2020-06-02 20:35:56
【问题描述】:

第一次在这里发帖,所以如果我有什么错误,请告诉我,我很乐意改正它!

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

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

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

  • ...

  • EN = x% 发生概率

我想知道有的概率:

  • 这些事件都没有发生
  • 这些事件中的任何一种发生
  • 其中任意 2 个事件发生
  • 这些事件中的任何 3 个发生
  • ...
  • 所有 N 个事件发生

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

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

提前致谢!

编辑:这些事件确实是独立的

【问题讨论】:

  • (关注/依赖评论?)
  • 鉴于 OP 说明 0 事件发生的概率是多少,这些事件必须是独立的。
  • @grey 是的,它们是独立的。很抱歉造成混乱

标签: algorithm matlab recursion probability


【解决方案1】:

听起来像泊松二项式 wikipedia link.

有一个明确的递归公式,但要注意数值稳定性。

在哪里

【讨论】:

    【解决方案2】:

    类似下面的递归程序应该可以工作。

    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 运算符的说明。

    【讨论】:

    • 我理解你的大部分逻辑,但是'probability_vector'来自哪里?好像是一个未定义的变量?
    • @aboublemc 我没有Matlab,20年没试过用它编程,所以可能有明显的bug。但是我们希望得到一个向量,它是有 0 个事件、1 个事件、2 个事件等的概率。我正在尝试编写一个函数,该函数基于以下事实来计算,即对于 0 或 1 个事件我知道什么向量应该是,我知道如何将它们中的两个结合起来。
    【解决方案3】:

    您需要计算自己版本的帕斯卡三角形,并在每个位置使用概率(而不是计数)。第 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]

    这是否会让您朝着解决方案迈进?

    【讨论】:

    • 嗨 Prune,感谢您的快速回复!我确实按照解释直到递归定义。例如,如果我们试图找到 M[2,0](即它应该等于 0.12),那么我们将有: M[2,0] = M[1,0]*P[2] + M[1,0]*(1-P[2]) + M[1,1]*P[2] = (0.3*0.4) + (0.3*0.6) + (0.7*0.4) = 0.58 ?跨度>
    • 是的......我搞砸了我的变速。左上角仍然是对角线;右上角是正上方。请相应调整下标。
    • 我不太清楚你的意思是什么?你能告诉我你在代码中的意思吗?
    • 我相信这仍然不适用于 M[2,0] 示例,因为您的最后一个术语 M[k-1,i-1] 指的是 M[1,-1]不存在?
    • 不,您仍然需要处理边缘情况。你给了我们一个一般的算法问题,而不是部分正确的代码。因此,我给了你通用的伪代码。
    【解决方案4】:

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

    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 回答很有帮助)。

    【讨论】:

      【解决方案5】:

      这些答案对我来说似乎都不起作用/无法理解,所以我计算了它并自己在 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)$ 是 i 事件发生的概率,给定 $P = {p_i...p_n}$,每个事件的伯努利概率。

      【讨论】:

        猜你喜欢
        • 2012-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多