为了完整起见,我正在生成高斯,这是我的实现:
from numpy import *
x=linspace(0,1,1000)
y=exp(-(x-0.5)**2/(2.0*(0.1/(2*sqrt(2*log(2))))**2))
峰值位于0.5
和fwhm=0.1
。到目前为止没那么有趣。在下一步中,我使用numpys
random.poisson实现来计算我的数据集的泊松分布。
poi = random.poisson(lam=y)
我遇到两个主要问题。
编辑:3。问题:在这种情况下,'size'变量用于什么?我已经看到了不同类型的用法,但最后他们没有给我不同的结果,但在选择错误时却失败了......
EDIT2:好的,从我得到的答案我认为我不够清楚(虽然它已经帮助我纠正了我做的其他一些愚蠢的错误,谢谢你!)。我想要做的是将poisson(白色)噪声应用于函数y。正如MSeifert在下面的帖子中所描述的,我现在使用期望值作为lam。但这只会给我带来噪音。我想我在应用噪声的程度上有一些理解问题(也许它与物理学有关??)。
答案 0 :(得分:11)
首先,假设您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.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,因此泊松分布几乎总是为0。高斯具有它的最大值为1. 1的泊松分布看起来像这样(左边是信号+泊松,右边是泊松分布,值为1)
因此你会在该地区获得大量的0和1以及2。但是也有可能你将值绘制到7。这正是我提到的反对称性。如果你改变高斯的幅度(例如乘以1000),那么" fit"因为泊松分布在那里几乎是对称的,所以要好得多: