如何计算满足不同下限的事件序列的联合概率?
概率计算疑问与实现
数值分布
| Value | N Cases | % |
|---|---|---|
| 0 | 60 | 60 |
| 1 | 20 | 20 |
| 2 | 10 | 10 |
| 3 | 8 | 8 |
| 4 | 2 | 2 |
生成该分布的代码:
import pandas as pd from math import factorial from itertools import product Value = [0,1,2,3,4] N_freq = [60,20,10,8,2] Perc = [0.60,0.20,0.10,0.08,0.02] df = pd.DataFrame({"Value": Value, "N_freq":N_freq, "Perc":Perc}) df
已知累积概率:
- X≥0的概率为100%
- X≥1的概率为40%
问题描述
当计算无顺序且独立的事件序列X₁≥0、X₂≥0、X₃≥1的联合概率时,我最初计算为100%×100%×40%=40%,但实际上唯一不满足该序列的事件是(0,0,0),其概率为60%×60%×60%=21.6%,因此正确概率应为100%-21.6%=78.4%。
我在累积概率的加权计算中忽略了什么?有没有一种无需枚举所有事件再求和的高效方法(当数值数量极大时,枚举不可行)?
我的实现代码
from functools import reduce def CombinationsVectorWithReplacementAndOrder(vect): """ 计算向量的可重复有序组合数 公式:Result = D! / ∏(s∈S) n(s,d)! 其中D是向量长度,n(s,d)是每个值在向量中出现的次数 """ d = len(vect) # 序列长度 # 分子 NumeratorFormula = factorial(d) # 分母 df_vec = pd.DataFrame(vect, columns = ["vec_values"]).vec_values.value_counts().values # 若所有元素相同,直接取该元素出现次数的阶乘 if len(df_vec)==1: DenominatorFormula = factorial(df_vec[0]) else: DenominatorFormula = 1 for val in df_vec: DenominatorFormula *= factorial(val) # 结果 Formula = NumeratorFormula / DenominatorFormula return int(Formula) def CumProbWithNoOrder(df, Vals): MaxVal = df["Value"].max() ValList = [list(range(Val, MaxVal+1, 1)) for Val in Vals] l = list(product(*ValList)) AllComb = [list(elem) for elem in l] UniqueComb = [] for i in AllComb: if sorted(i) not in UniqueComb: UniqueComb.append(sorted(i)) TotalProb = 0 for Comb in UniqueComb : Prob = float(pd.DataFrame([float(df["Perc"][df["Value"] == c]) for c in Comb]).prod()) Combinations = CombinationsVectorWithReplacementAndOrder(Comb) TotalProb += Prob * Combinations print(f'概率为', TotalProb ) return TotalProb # 要评估的“大于等于”阈值序列 Value_threshold = [0,0,1] CumProbWithNoOrder(df, Value_threshold) # 输出0.7840000000000001
内容的提问来源于stack exchange,提问作者Carles
相关产品推荐
相关产品推荐

