泊松分布密度图绘制报错求助:含代码及尝试方案
泊松分布密度图与直方图绘制问题解决
你的代码报错核心问题是np.math.factorial(x)无法处理数组输入——这个函数只能计算单个整数的阶乘,而x是长度为20的numpy数组,直接传入会触发类型错误。以下是两种可行的修正方案:
方案一:使用Scipy现成函数(推荐)
借助scipy.stats中的泊松分布工具类,能直接计算概率质量函数(PMF)并生成样本,代码简洁高效:
import numpy as np import matplotlib.pyplot as plt from scipy.stats import poisson lam = 3 # 泊松分布参数λ x = np.arange(0, 20) # 计算泊松分布理论概率质量函数 y = poisson.pmf(x, lam) # 绘制理论分布点图 plt.plot(x, y, 'bo', ms=8) plt.xlabel("随机变量取值") plt.ylabel("概率质量") plt.title("泊松分布(λ=3)") plt.show() # 生成样本并绘制直方图对比 samples = poisson.rvs(lam, size=1000) plt.hist(samples, bins=np.arange(0, 20)-0.5, density=True, alpha=0.5, label='样本直方图') plt.plot(x, y, 'bo-', ms=6, label='泊松PMF') plt.xlabel("随机变量取值") plt.ylabel("概率密度/质量") plt.title("泊松分布样本直方图与理论分布") plt.legend() plt.show()
方案二:手动实现向量化阶乘计算
如果不想依赖Scipy,可以用numpy的gamma函数实现数组阶乘计算(因为n! = Γ(n+1),gamma函数支持数组输入):
import numpy as np import matplotlib.pyplot as plt lam = 3 x = np.arange(0, 20) # 用gamma函数计算数组的阶乘,替代单个值的factorial函数 y = np.exp(-lam) * (lam ** x) / np.gamma(x + 1) # 绘制理论分布点图 plt.plot(x, y, 'bo', ms=8) plt.xlabel("随机变量取值") plt.ylabel("概率质量") plt.title("泊松分布(λ=3)") plt.show() # 生成样本并绘制直方图对比 samples = np.random.poisson(lam, size=1000) plt.hist(samples, bins=np.arange(0, 20)-0.5, density=True, alpha=0.5, label='样本直方图') plt.plot(x, y, 'bo-', ms=6, label='泊松PMF') plt.xlabel("随机变量取值") plt.ylabel("概率密度/质量") plt.title("泊松分布样本直方图与理论分布") plt.legend() plt.show()
注意事项
- 泊松分布是离散分布,严格来说对应的是概率质量函数(PMF),而非连续分布的密度函数,标注时可以对应调整更准确。
- 绘制直方图时,
bins=np.arange(0,20)-0.5能让直方图柱子精准对齐离散整数取值。 density=True参数让直方图面积总和为1,方便和理论PMF直接对比。
内容的提问来源于stack exchange,提问作者Ceonas
相关产品推荐
相关产品推荐

