Python Numpy 泊松分布

7

我正在生成一个高斯分布,为了完整起见,这是我的实现:

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,半高宽为0.1。到此为止还不是很有趣。在下一步中,我使用 numpys 中的 random.poisson 实现计算了我的数据集的泊松分布。

poi = random.poisson(lam=y)

我有两个主要问题:
  1. 泊松分布的特点是方差等于期望值,但是mean()和var()输出不相等,这让我很困惑。
  2. 绘图时,泊松分布仅采用整数值,最大值约为7或6,而我的旧函数y的最大值为1。据我所知,泊松分布函数应该给出我的实际函数y的“拟合”。为什么最大值不相等?对不起我的错误,实际上我正在模拟泊松分布噪声,但我想你理解这种情况下的“拟合”。

编辑:第三个问题:在这种情况下,“size”变量用于什么?我看到不同类型的用法,但最终它们没有给我不同的结果,但选择错误会导致失败...

编辑2:好吧,从我得到的答案来看,我认为我表述不够清楚(虽然它已经帮助我纠正了其他愚蠢的错误,谢谢!)。我想做的是将泊松(白)噪声应用于函数y。如MSeifert在下面的帖子中所描述的那样,现在我使用期望值作为lam。但这只给我带来了噪声。我想我在如何应用这种噪声的层面上有一些理解问题(也许更多是物理相关?!)。


你在mean和var中输入了什么参数?poi不是泊松分布。 - Prune
顺便说一句,如果你将 linspace 调用更改为 1001,结果会更易读 - 在远端添加一个栅栏,使它们成为 10^-3 的倍数。 - Prune
1个回答

19

首先,我将写下这个答案,假设你已经import numpy as np因为它能够清楚地区分numpy函数和python的内置函数或者mathrandom包中的函数。

我认为没有必要回答你指定的问题,因为你的基本假设是错误的:

是的,泊松统计有一个平均值等于方差,但这假设你使用一个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.varnp.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的泊松分布)

enter image description here

因此,您将得到大量的0和1以及该区域中的一些2。但也有可能会绘制高达7的值。这正是我提到的反对称性。如果您更改高斯的振幅(例如将其乘以1000),则“拟合”要好得多,因为在那里泊松分布几乎是对称的:

enter image description here


嗨,非常感谢您提供如此长而详尽的解释。不过,我想我表达得不够清楚。实际上,我想将泊松(白噪声)噪声应用于高斯函数。 - famfop
@famfop - 我已经扩展了答案,并附上了一个简短的评论,解释为什么它不能近似你的信号。我真的误解了你问题的某些部分,非常抱歉。 - MSeifert
@MSeifert 你好,非常感谢(再次:D)!!! 现在我明白了!我只需要有人一步一步地解释这个过程。 - famfop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接