我正在比较我应用 poisson 噪音的两组值。 以下是我的代码和相应的结果:
import numpy as np
import pylab
size = 14000
# 1) Creating first array
np.random.seed(1)
sample = np.zeros((size),dtype="int")+1000
# Applying poisson noise
random_sample1 = np.random.poisson(sample)
# 2) Creating the second array (with some changed values)
# Update some of the value to 2000...
for x in range(size):
if not(x%220):
sample[x]=2000
# Reset the seed to the SAME as for the first array
# so that poisson shall rely on same random.
np.random.seed(1)
# Applying poisson noise
random_sample2 = np.random.poisson(sample)
# Display diff result
pylab.plot(random_sample2-random_sample1)
pylab.show()
我的问题是:为什么我在[10335-12542]周围有这个奇怪的值,我会期待一个完美的零点?
我在poisson()文档中搜索信息但没有成功。
我(仅)测试并重现python版本1.7.6和1.7.9中的问题(它可能出现在其他人身上)。 测试Numpy版本:1.6.2和1.9.2
如果我打印相关值,请提供更多详细信息:
random_sample1[10335:10345]
[ 977 1053 968 1032 1051 953 1036 1035 967 954]
# OK OK OK OK OK OK! ??? ??? ??? ???
random_sample2[10335:10345]
[ 977 1053 968 1032 1051 2051 1035 967 954 1034]
# OK OK OK OK OK OK! ??? ??? ??? ???
我们清楚地看到,直到索引10339的值与索引10340的值完全相同,因为我们有sample[10340] == 2000
这是我们想要的。但接下来的价值不是我们所期望的!他们似乎从1指数转移了!
答案 0 :(得分:1)
这在计算泊松分布的随机样本的算法中是隐含的。请参阅source code here.
随机样本在条件循环中计算,该循环获得新的随机值,并在此值高于某个基于lambda的阈值时返回。对于不同的lambda,它可能需要不同次数的尝试。然后将抵消以下随机值,从而导致您看到的结果不同。然后,随机值再次同步。
在您的具体示例中,它使用一个额外的随机值来获取样本#10340。之后,所有值都会偏移一个。