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

Numpy与Scipy泊松分布随机采样异常:Scipy无0值输出?

泊松分布采样异常问题排查

问题现象

使用numpy和scipy分别生成泊松分布随机样本时,发现scipy的采样结果从未出现x=0,所有值整体右移了1位。测试代码及输出表现如下:

测试代码

# Check Poisson samples
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gamma, poisson

N = 100000
plot_low=0
plot_high=40
x = np.arange(plot_low, plot_high)
mission_time = 40
lambda_val = 0.2
poisson_mu = lambda_val*mission_time

Poisson_np = []
Poisson_scipy = []
for i in range(N):
  x_simulated_scipy = poisson.rvs(poisson_mu, 1) # NOTE this function is off by x=1
  x_simulated_np = np.random.poisson(lam=poisson_mu)
    # Now randomly sample from the Poisson model
  Poisson_np.append(x_simulated_np)
  Poisson_scipy.append(x_simulated_scipy)

Poisson_np_pmf = []
Poisson_scipy_pmf = []
for i in range(plot_high):
  # Count how many times we saw X=i then divided by N to get the probability X=i
  np_pmf = Poisson_np.count(i)/N
  Poisson_np_pmf.append(np_pmf)
  scipy_pmf = Poisson_scipy.count(i)/N
  Poisson_scipy_pmf.append(scipy_pmf)
  if i == 0:
    print("NUMPY zero count =", Poisson_np.count(0))
    print("SCIPY zero count =", Poisson_scipy.count(0))

plt.plot(x, Poisson_np_pmf, '.', ms=5, mec='b', alpha=0.7)
plt.vlines(x, 0, Poisson_np_pmf, colors='b', lw=3, label='Poisson via NUMPY', alpha=0.5)
plt.plot(x, Poisson_scipy_pmf, '.', ms=5, mec='r', alpha=0.5)
plt.vlines(x, 0, Poisson_scipy_pmf, colors='r', lw=3, label='Poisson via SCIPY', alpha=0.5)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Poisson Distribution (40 year duration)')
plt.grid(True)
plt.legend()
plt.show()

输出表现

运行代码后,numpy生成的样本包含x=0的情况,而scipy生成的样本中x=0的计数为0,所有采样值比预期大1,分布曲线整体右移。

问题原因

scipy.stats.poisson.rvs的参数使用错误:

  • 函数签名为poisson.rvs(mu, loc=0, size=None, random_state=None)
  • 你传入的第二个参数1被当作了loc参数(位置偏移量),导致生成的样本是泊松分布结果+1,即Poisson(mu) + 1,因此永远不会出现0。
  • numpy的np.random.poisson函数第二个参数是样本数量,和scipy的参数定义不一致,这是核心混淆点。

解决方法

将scipy的采样代码修改为指定size参数,而非直接传位置参数:

# 正确写法1:显式指定size参数
x_simulated_scipy = poisson.rvs(poisson_mu, size=1)
# 正确写法2:省略size,默认生成单个样本
x_simulated_scipy = poisson.rvs(poisson_mu)

修改后重新运行代码,scipy生成的样本会和numpy一致,包含x=0的情况,两条分布曲线将重合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:29:52