You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泊松分布密度图绘制报错求助:含代码及尝试方案

泊松分布密度图与直方图绘制问题解决

你的代码报错核心问题是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:32:24