我需要在Python 3中编写一个函数,该函数返回矩形域(例如100x100点)上的位置数组(x,y),这些位置根据同质空间泊松过程分散。
到目前为止,我已经用Python代码找到了这个资源,但不幸的是,我无法为Python3:找到/安装scipy
http://connor-johnson.com/2014/02/25/spatial-point-processes/
不过,它帮助我理解了泊松点过程到底是什么以及它是如何工作的。
我已经玩了一段时间的numpy.random.poisson了,但我很难解释它的回报。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.poisson.html
>>> import numpy as np
>>> np.random.poisson(1, (1, 5, 5))
array([[[0, 2, 0, 1, 0],
[3, 2, 0, 2, 1],
[0, 1, 3, 3, 2],
[0, 1, 2, 0, 2],
[1, 2, 1, 0, 3]]])
我认为该命令所做的是创建一个5x5字段=(1,5,5),并在该字段上以lambda=1的速率散射对象。结果矩阵中显示的数字是物体位于该特定位置的概率。
我如何根据均匀空间泊松过程将十个物体分散在5x5的场上?我的第一个猜测是在整个数组上迭代,在每个位置插入一个带有"3"的对象,然后在其他位置上插入一个带"2"的对象等等,但我不确定我应该用来确定是否应该插入对象的实际概率。
根据以下资源,我可以通过简单地将速率与对象计数相乘(10*1=10),并使用该值作为我的lambda,即,来模拟10个对象以1的速率散布在一个场上
>>> np.random.poisson(10, (1, 5, 5))
array([[[12, 12, 10, 16, 16],
[ 8, 6, 8, 12, 9],
[12, 4, 10, 3, 8],
[15, 10, 10, 15, 7],
[ 8, 13, 12, 9, 7]]])
然而,我不认为这会让事情变得更容易。这样,我只会将对象出现的速率增加10。
matlab 中的泊松点过程
总之,我的主要问题是:如何使用numpy.random.poisson(lam, size)
来对散布在二维域dx*dy
上的多个对象n
进行建模?
我似乎错误地看待了这个问题。经过更多的离线研究,我发现实际上创建一个随机泊松值就足够了,它表示对象的数量,例如n = np.random.poisson(100)
,并在0和1 之间创建相同数量的随机值
x = np.random.rand(n)
y = np.random.rand(n)
现在我只需要将x和y值的两个数组连接到(x,y)元组的数组中。这些是我一直在寻找的随机位置。我可以将每个x和y值乘以我的字段的边长,例如100,以将值缩放到我想要显示的100x100字段。
我认为这些位置的"随机性"应该由随机泊松过程来确定,但似乎只是位置的个数需要由它来确定,而不是实际的位置值。
这都是正确的。你肯定不需要SciPy,尽管当我第一次在Python中模拟泊松点过程时,我也使用了SciPy。我在这篇文章中展示了模拟过程中的原始代码细节:
https://hpaulkeeler.com/poisson-point-process-simulation/
我只是在最近的代码中使用NumPy:
import numpy as np; #NumPy package for arrays, random number generation, etc
import matplotlib.pyplot as plt #for plotting
#Simulation window parameters
xMin=0;xMax=1;
yMin=0;yMax=1;
xDelta=xMax-xMin;yDelta=yMax-yMin; #rectangle dimensions
areaTotal=xDelta*yDelta;
#Point process parameters
lambda0=100; #intensity (ie mean density) of the Poisson process
#Simulate a Poisson point process
numbPoints = np.random.poisson(lambda0*areaTotal);#Poisson number of points
xx = xDelta*np.random.uniform(0,1,numbPoints)+xMin;#x coordinates of Poisson points
yy = yDelta*np.random.uniform(0,1,numbPoints)+yMin;#y coordinates of Poisson points
代码也可以在这里找到:
https://github.com/hpaulkeeler/posts/tree/master/PoissonRectangle
我还上传了更多的Python(以及MATLAB和Julia)代码,用于模拟多个点过程,包括各种形状的泊松点过程和簇点过程。
https://github.com/hpaulkeeler/posts