首页 > 解决方案 > 序列上泊松噪声实现的再现性

问题描述

这是我的问题:我有一系列 float int 值(这是一个模拟的天文图像,但这并不重要)。我需要得到这个序列的泊松实现。然后我想改变一些值/像素并再次获得这个新序列的泊松实现。我需要不变的像素得到相同的噪声。

import numpy
from numpy.random import default_rng,randint
import copy
import pylab

# Create the two lists (with only few pixels changing)
a0 = numpy.random.randint(low=0, high=1e6, size=10000).astype('float')
a = numpy.random.randint(low=0, high=30, size=10000).astype('float')
b = copy.copy(a)
b[a0>9.9e5] += 1e6

# Run poisson on them
gen1 = default_rng(seed=1234)
gen2 = default_rng(seed=1234)
resa = gen1.poisson(a)
resb = gen2.poisson(b)

# Plot the difference (reshape to 2D image to better see the differences)
pylab.imshow(resa.reshape((100,100))-resb.reshape((100,100)), vmin=-10,vmax=10)

使用泊松的numpy实现(numpy.random.poisson),即使种子相同,即使对于相同的像素,序列也会有所不同。原因是泊松噪声是在一个条件循环中计算的,它获取一个新的随机值,并在该值高于某个基于 lambda 的阈值时返回。因此,在两个不同的像素之后,default_rng(或RandomState)在两个序列中会有所不同,即使对于相同的像素也会给出不同的结果。

是否有泊松的实现可以保证在 RandomState 生成器上绘制相同数量的信号,无论信号级别如何?或者我是否必须自己调整代码(通过循环绘制以始终达到预定义的循环迭代)?

标签: numpyrandomrandom-seedpoisson

解决方案


推荐阅读