如何在scipy.stats中指定泊松分布的尾值?

时间:2017-08-27 05:17:09

标签: python scipy statistics

我想创建一个泊松分布,均值为2个元素数量为10000,最小值为1,尾值为140到目前为止我只能指定最小值

 stats.poisson.rvs( 2, loc = 1,size=10000)

并生成以下分布enter image description here

如何以140而不是11

结束

1 个答案:

答案 0 :(得分:4)

平均等于2的泊松分布中的样本大于140的可能性非常小,以至于您不会得到10000个样本中的一个。

实际上,泊松分布只有一个参数λ和一个概率质量函数定义为

P(x=k) = λ^k * exp(-λ) / k!

平均值也等于λ。如果λ= 2那么

P(x=140) = 7.7e-199

因此,如果有10000个样本,则至少有一个样本的可能性 10000中的140个将小于7.7e-195。这是一个非常小的数字,你不能指望它会在一生中发生。

计算出λ= 2的Poisson分布样本高于140的概率有点难。您可以使用scipy.stats.poisson.cdf来查看

P(x>=22) = 1 - scipy.stats.poisson.cdf(21,2) = 5.5e-16

因此,即使您在21岁以上的样本中有一个样本的机会小于5.5e-12也是如此。由于中间结果中的浮点舍入,以相同方式计算P(x>=140)将返回0。

<强>结论

如果您希望分布均值等于2.0,并且10000个样本上的重尾达到140,则需要与泊松不同的分布。你可以考虑Pareto分布,scipy.stats.pareto参数b = 2。

以下是来自

的10000个随机样本的比较
scipy.stats.poisson.rvs(2,size=10000)

numpy.rint(scipy.stats.pareto.rvs(2,size=10000))

Comparison of Poisson and Pareto distributions

很明显,具有相同均值的帕累托分布具有更重的尾部。

作为参考,情节的代码在

之下
import matplotlib.pyplot as plt
import scipy.stats
import numpy as np
pareto_x = np.rint(scipy.stats.pareto.rvs(2,size=10000))
poisson_x = scipy.stats.poisson.rvs(2,size=10000)
plt.figure(figsize=(8,4))
plt.subplot(121)
plt.title("Poisson distribution, a = 2")
plt.xlabel("sample number")
plt.ylabel("sample value")
plt.axis([0,10000,0,180])
plt.plot(range(0,10000),poisson_x,"o")
plt.subplot(122)
plt.axis([0,10000,0,180])
plt.title("Pareto distribution, b = 2")
plt.xlabel("sample number")
plt.plot(range(0,10000),pareto_x,"o")
plt.subplots_adjust(hspace=0.4,bottom=0.2)
plt.savefig("poisson_pareto.png")