Python Numpy 泊松分布
Python Numpy Poisson Distribution
我正在生成高斯,为了完整起见,这就是我的实现:
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)
我有两个主要问题。
- 泊松的一个特点是方差等于exp。价值,
比较 mean() 和 var() 的输出确实让我感到困惑,因为
输出不相等。
- 绘制此图时,泊松分布。只占用整数值
和最大。价值大约是 7,有时是 6,而我的旧功能
y 有最大值。在 1. Afai 理解,泊松函数应该
给我一个 'fit' 的实际函数 y。最大怎么来的
值不相等?抱歉我的数学错误,
实际上我这样做是为了模拟泊松分布的噪声,但我
我猜你理解 'fit' 在这种情况下。
编辑:3. 问题:在此上下文中使用的 'size' 变量是什么?我见过不同类型的用法,但最后它们并没有给我不同的结果,而是在选择错误时失败了...
EDIT2:好的,从我得到的答案来看,我认为我不够清楚(尽管它已经帮助我纠正了我犯的其他一些愚蠢的错误,谢谢!)。我想要做的是将泊松(白)噪声应用于函数 y。正如 MSeifert 在下面的 post 中所描述的,我现在使用期望值作为 lam。但这只会给我噪音。我想我在如何应用 th{is,e} 噪声的层面上存在一些理解问题(也许它与物理更相关?!)。
首先,我假设你是 import numpy as np
来写这个答案,因为它清楚地将 numpy
函数与内置函数或 math
和 random
的函数区分开来python.
包
我认为没有必要回答你指定的问题,因为你的基本假设是错误的:
是的,泊松统计有一个等于方差的均值,但假设您使用 常数 lam
。但你没有。您输入高斯的 y 值,因此您不能期望它们是常数(根据您的定义,它们是高斯!)。
使用np.random.poisson(lam=0.5)
从泊松分布中得到一个随机值。但要小心,因为此泊松分布甚至与您的高斯分布都不大致相同,因为您处于 "low-mean" 区间,这两者有显着差异,例如参见 [=28=].
此外,您正在创建随机数,因此您不应该真正绘制它们,而应该绘制其中的 np.histogram
。由于统计分布都是关于概率密度函数的(参见 Probability density function)。
之前,我已经提到你创建了一个常数 lam
的泊松分布,所以现在是时候谈谈 size
:你创建随机数,以便逼近真实的泊松分布distribution 你需要抽取很多随机数。大小就在这里: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
请注意高斯值几乎与我们定义为参数的值完全相同。另一方面,泊松均值和 var 几乎相等。您可以通过增加上面的 size
来提高 mean 和 var 的精度。
为什么泊松分布不接近您的原始信号
您的原始信号仅包含 0 到 1 之间的值,因此泊松分布只允许正整数,标准差与平均值相关联。离高斯均值很远,你的信号近似为 0,所以泊松分布几乎总是绘制 0。高斯分布的最大值为 1。1 的泊松分布看起来像这样(左边是信号 + 泊松右边是值 1)
附近的泊松分布
所以你会在那个地区得到很多 0 和 1,还有一些 2。但也有可能你绘制的值最大为 7。这正是我提到的反对称性。如果你改变高斯的振幅(例如乘以 1000),"fit" 会好得多,因为那里的泊松分布几乎是对称的:
我正在生成高斯,为了完整起见,这就是我的实现:
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)
我有两个主要问题。
- 泊松的一个特点是方差等于exp。价值, 比较 mean() 和 var() 的输出确实让我感到困惑,因为 输出不相等。
- 绘制此图时,泊松分布。只占用整数值 和最大。价值大约是 7,有时是 6,而我的旧功能 y 有最大值。在 1. Afai 理解,泊松函数应该 给我一个 'fit' 的实际函数 y。最大怎么来的 值不相等?抱歉我的数学错误, 实际上我这样做是为了模拟泊松分布的噪声,但我 我猜你理解 'fit' 在这种情况下。
编辑:3. 问题:在此上下文中使用的 'size' 变量是什么?我见过不同类型的用法,但最后它们并没有给我不同的结果,而是在选择错误时失败了...
EDIT2:好的,从我得到的答案来看,我认为我不够清楚(尽管它已经帮助我纠正了我犯的其他一些愚蠢的错误,谢谢!)。我想要做的是将泊松(白)噪声应用于函数 y。正如 MSeifert 在下面的 post 中所描述的,我现在使用期望值作为 lam。但这只会给我噪音。我想我在如何应用 th{is,e} 噪声的层面上存在一些理解问题(也许它与物理更相关?!)。
首先,我假设你是 import numpy as np
来写这个答案,因为它清楚地将 numpy
函数与内置函数或 math
和 random
的函数区分开来python.
我认为没有必要回答你指定的问题,因为你的基本假设是错误的:
是的,泊松统计有一个等于方差的均值,但假设您使用 常数 lam
。但你没有。您输入高斯的 y 值,因此您不能期望它们是常数(根据您的定义,它们是高斯!)。
使用np.random.poisson(lam=0.5)
从泊松分布中得到一个随机值。但要小心,因为此泊松分布甚至与您的高斯分布都不大致相同,因为您处于 "low-mean" 区间,这两者有显着差异,例如参见 [=28=].
此外,您正在创建随机数,因此您不应该真正绘制它们,而应该绘制其中的 np.histogram
。由于统计分布都是关于概率密度函数的(参见 Probability density function)。
之前,我已经提到你创建了一个常数 lam
的泊松分布,所以现在是时候谈谈 size
:你创建随机数,以便逼近真实的泊松分布distribution 你需要抽取很多随机数。大小就在这里: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
请注意高斯值几乎与我们定义为参数的值完全相同。另一方面,泊松均值和 var 几乎相等。您可以通过增加上面的 size
来提高 mean 和 var 的精度。
为什么泊松分布不接近您的原始信号
您的原始信号仅包含 0 到 1 之间的值,因此泊松分布只允许正整数,标准差与平均值相关联。离高斯均值很远,你的信号近似为 0,所以泊松分布几乎总是绘制 0。高斯分布的最大值为 1。1 的泊松分布看起来像这样(左边是信号 + 泊松右边是值 1)
附近的泊松分布所以你会在那个地区得到很多 0 和 1,还有一些 2。但也有可能你绘制的值最大为 7。这正是我提到的反对称性。如果你改变高斯的振幅(例如乘以 1000),"fit" 会好得多,因为那里的泊松分布几乎是对称的: