首先,我将写下这个答案,假设你已经import numpy as np
因为它能够清楚地区分numpy函数和python的内置函数或者math
和random
包中的函数。
我认为没有必要回答你指定的问题,因为你的基本假设是错误的:
是的,泊松统计有一个平均值等于方差,但这假设你使用一个lam
常数。但你并没有。你输入高斯分布的y值,所以你不能期望它们是恒定的(根据你的定义它们是高斯的!)。
使用np.random.poisson(lam=0.5)
获取泊松分布的一个随机值。但要小心,因为这个泊松分布甚至与高斯分布近似不相同,因为你处于"低平均值"区间,两者显着不同,例如参见维基百科关于泊松分布的文章。
此外,你正在创建随机数,所以你不应该真正绘制它们,而是绘制它们的np.histogram
。由于统计分布都是关于概率密度函数的(参见概率密度函数)。
之前,我已经提到你使用一个常数lam
创建泊松分布,现在是讨论size
的时候了:你正在创建随机数,因此为了近似真实的泊松分布,你需要生成很多随机数。这就涉及到size
:例如,np.random.poisson(lam=0.5, size=10000)
会创建一个由10000个元素组成的数组,每个元素都从泊松概率密度函数中绘制,平均值为0.5
。
如果你之前没有在上述维基百科文章中读到,那么请注意,泊松分布根据定义只能产生无符号(>= 0)整数作为结果。
所以我想你想要做的是创建包含1000个值的高斯分布和泊松分布:
gaussian = np.random.normal(0.5, 2*np.sqrt(2*np.log(2)), 1000)
poisson = np.random.poisson(0.5, 1000)
然后将其绘制出来,绘制直方图:
import matplotlib.pyplot as plt
plt.hist(gaussian)
plt.hist(poisson)
plt.show()
或者使用np.histogram
。
要从您的随机样本中获取统计信息,仍然可以在高斯和泊松样本上使用np.var
和np.mean
。 这一次(至少在我的样本运行中),它们给出了良好的结果:
print(np.mean(gaussian))
0.653517935138
print(np.var(gaussian))
5.4848398775
print(np.mean(poisson))
0.477
print(np.var(poisson))
0.463471
注意高斯值几乎完全符合我们定义的参数。另一方面,泊松均值和方差几乎相等。如果你增加 size
,可以提高均值和方差的精度。
为什么泊松分布不能逼近原始信号
您的原始信号仅包含介于0和1之间的值,因此泊松分布仅允许正整数,并且标准差与均值值相关联。从高斯的平均值远离您的信号,它几乎总是绘制0。当高斯分布取到最大值1时,泊松分布如下所示(左边是信号+泊松分布图,右边是围绕值1的泊松分布)
因此,您将得到大量的0和1以及该区域中的一些2。但也有可能会绘制高达7的值。这正是我提到的反对称性。如果您更改高斯的振幅(例如将其乘以1000),则“拟合”要好得多,因为在那里泊松分布几乎是对称的: