首先,假设您import numpy as np,我会写下这个答案,因为它明确区分numpy函数与内置函数或math和random的函数包的python。
我认为没有必要回答您指定的问题,因为您的基本假设是错误的:
是的,泊松统计量的均值等于方差,但假设您使用常数 lam。但你不是。你输入高斯的y值,所以你不能指望它们是恒定的(它们是你的定义高斯!)。
使用np.random.poisson(lam=0.5)从泊松分布中获取一个随机值。但要小心,因为这个泊松分布甚至与你的高斯分布大致相同,因为你处于低均值"两者都有显着差异的区间,例如参见Wikipedia article about Poisson distribution。
此外,您正在创建随机数字,因此您不应该绘制它们,而是绘制np.histogram个。由于统计分布都与概率密度函数有关(见Probability density function)。
之前,我已经提到你创建了一个带有常数lam的泊松分布,所以现在是时候讨论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.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,因此泊松分布几乎总是为0。高斯具有它的最大值为1. 1的泊松分布看起来像这样(左边是信号+泊松,右边是泊松分布,值为1)
因此你会在该地区获得大量的0和1以及2。但是也有可能你将值绘制到7。这正是我提到的反对称性。如果你改变高斯的幅度(例如乘以1000),那么" fit"因为泊松分布在那里几乎是对称的,所以要好得多: