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

如何在Python中基于Poisson变量正确应用Skellam分布?

正确使用Python实现Skellam分布

你之前的核心错误

Skellam分布描述的是两个独立泊松随机变量的差值的概率分布,即 ( Z = X - Y )(其中 ( X \sim \text{Poisson}(\mu_X) ),( Y \sim \text{Poisson}(\mu_Y) )),不是把两个泊松事件的概率值直接相减。你之前计算的21.75%是 ( P(X=3) ) 的概率,7.58%是 ( P(Y=2) ) 的概率,直接相减没有任何统计意义。


用Scipy正确实现Skellam分布

Scipy的scipy.stats模块已经内置了Skellam分布的实现,直接调用即可完成概率计算、样本生成等操作。

步骤1:导入依赖库

from scipy.stats import skellam
import numpy as np

步骤2:初始化Skellam分布

传入两个泊松分布的均值参数 ( \mu_X ) 和 ( \mu_Y ):

mu_X = 2.6
mu_Y = 0.5
# 初始化Skellam分布对象
skellam_dist = skellam(mu_X, mu_Y)

步骤3:计算概率质量函数(PMF)

PMF用于计算Z取某个具体整数值的概率,比如你之前计算的 ( X=3 )、( Y=2 ),对应 ( Z=1 ),计算 ( P(Z=1) ):

# 计算Z=1时的概率
pmf_z1 = skellam_dist.pmf(1)
print(f"P(Z=1) = {pmf_z1 * 100:.2f}%")

如果需要批量计算多个Z值的概率:

# 计算Z从-2到5的概率
z_values = np.arange(-2, 6)
pmf_values = skellam_dist.pmf(z_values)
for z, pmf in zip(z_values, pmf_values):
    print(f"P(Z={z}) = {pmf * 100:.2f}%")

步骤4:计算累积分布函数(CDF)

CDF用于计算 ( Z \leq \text{某个值} ) 的累积概率,比如 ( P(Z \leq 2) ):

cdf_z2 = skellam_dist.cdf(2)
print(f"P(Z ≤ 2) = {cdf_z2 * 100:.2f}%")

步骤5:生成Skellam分布的样本

如果需要生成符合该分布的随机样本:

# 生成10个随机样本
samples = skellam_dist.rvs(size=10)
print("生成的Skellam分布样本:", samples)

手动验证(可选)

如果想理解Skellam分布的计算逻辑,可以手动累加所有满足 ( x-y=z ) 的 ( (x,y) ) 组合的概率乘积,以 ( Z=1 ) 为例:

manual_pmf = 0.0
x = 1  # y = x-1 ≥ 0 → x≥1
while True:
    # 计算P(X=x)
    poisson_x = (mu_X ** x * np.exp(-mu_X)) / np.math.factorial(x)
    # 计算P(Y=x-1)
    poisson_y = (mu_Y ** (x-1) * np.exp(-mu_Y)) / np.math.factorial(x-1)
    term = poisson_x * poisson_y
    manual_pmf += term
    # 当项足够小时停止计算
    if term < 1e-10:
        break
    x += 1
print(f"手动计算P(Z=1) = {manual_pmf * 100:.2f}%")

这个结果会和Scipy计算的PMF值几乎一致。

内容的提问来源于stack exchange,提问作者Drankenkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:06:20