Python 3中的Poisson Point Process,有numpy,没有scipy

问题描述 投票:4回答:2

我需要在Python 3中编写一个函数,该函数返回一个矩形场(例如100x100点)上的位置数组(x,y),这些场是根据均匀空间泊松过程分散的。

到目前为止,我已经使用Python代码找到了这个资源,但不幸的是,我无法为Python 3找到/安装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)并散布λ= 1的对象。结果矩阵中显示的数字是物体位于该特定位置的概率。

根据同质空间泊松过程,我怎样才能在该5x5场上散布10个物体?我的第一个猜测是遍历整个数组并在每个位置上插入一个“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]]])

但是,我不明白这应该如何让事情变得更容易。我只是以这种方式增加对象出现的速率。

Poisson point process in matlab

总结一下,我的主要问题是:我如何使用numpy.random.poisson(lam, size)来模拟在二维场n上散布的数量dx*dy

python numpy spatial poisson
2个回答
1
投票

我似乎以错误的方式看待了这个问题。经过更多的离线研究后,我发现实际上足以创建一个表示对象数量的随机泊松值,例如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字段。

我认为这些位置的“随机性”应该由随机泊松过程确定,但似乎只需要由它确定位置的数量,而不是实际的位置值。


0
投票

这一切都是正确的。你绝对不需要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

© www.soinside.com 2019 - 2024. All rights reserved.