如何计算多项分布各结果概率,获取类似stats.binom.pmf输出的概率数组
你可以通过numpy和scipy工具包快速实现这个需求,具体方法如下:
首先导入依赖库:
import numpy as np from scipy import stats
实现逻辑
你提到的多项分布是统计N次试验中每个类别出现次数的概率,而你需要的是多次掷骰子的点数总和的概率,更高效的方式是通过离散概率分布的卷积叠加单颗骰子的分布,和你之前用stats.binom.pmf的实现逻辑类似,二项分布本质就是固定二值试验的分布叠加。
具体代码如下:
# 定义单颗骰子的分布:取值范围1~6,每个取值概率相等 single_die = stats.randint(1, 7) # 提取单颗骰子对应点数1~6的概率数组 pmf_1 = single_die.pmf(np.arange(1, 7)) # 两次卷积得到两颗骰子点数和的概率(和范围2~12) pmf_2 = np.convolve(pmf_1, pmf_1) # 三次卷积得到三颗骰子点数和的概率,对应取值范围正好是你需要的3~18 pmf_3 = np.convolve(pmf_2, pmf_1) # 输出结果,数组索引0对应总点数3,索引15对应总点数18 print(pmf_3)
运行后的输出示例:
array([0.00462963, 0.01388889, 0.02777778, 0.0462963 , 0.06944444, 0.09722222, 0.11574074, 0.125 , 0.125 , 0.11574074, 0.09722222, 0.06944444, 0.0462963 , 0.02777778, 0.01388889, 0.00462963])
如果需要调整掷骰子的次数,只要重复卷积对应次数即可,比枚举所有组合或者调用多项分布统计的效率高很多。
内容的提问来源于stack exchange,提问作者Terry Bogard
相关产品推荐
相关产品推荐

