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
相关产品推荐
相关产品推荐

