泊松点过程


泊松点过程Poisson point process

介绍

概念解释

首先我们要清楚的是泊松过程是一个 计数过程 。对于二维或者三维的PPP而言,随机抽样出来的样本点在范围内服从均匀分布,样本点之间的距离服从指数分布。这句话我并没有去深入理解研究,我看了中外多种资料后得到了个人对于同质泊松点过程的理解如下:

PPP的解释公式

以上是特意针对与泊松点分布的公式,这里与一般的泊松过程有所不同(或许是相同的只是我不懂(ˉ▽ˉ;)... )。其中就是给定的一个参数,可以称为密度,代表着一个数学区域,通俗来说就是给定的二维平面或者三维空间(高维可不用考虑了,没必要)。记,这一参数可以被称为速率或者强度。那么在区域中的随机撒点个数就服从了泊松分布。事实上,参数代表的是,也就是多次泊松点过程后在区域上产生随机点个数的均值。这一点可以在我结合的程序中通过Null的值来体现,可以发现多次仿真后它的值是在40附近波动的。

模拟方法

(这里的表述来自维基百科,其思想似乎和CSDN都是一样的)对于一个泊松点过程,通常在一个边界区域中完成,我们大致需要两步:①创建随机点数②以适当的方式随机布点

创建随机点数

随机点数W的模拟通过随机数生成功能能够模拟泊松随机变量,这里程序对应着 %%% Part1 %%% 。具体方法来源于CSDN

产生随机点个数方法

这里等同于

点的位置分布

对于常规的二维平面或者三维空间(可以理解为矩形或者立方体吧❓),每个坐标均匀的分布在区域中,也就是通过均匀分布的方法。如果是非笛卡尔子空间(如球体或者球表面),则不会是均匀地放置并且需要适当的更改坐标(无详解)

程序

2D&3D PPP,参考链接

%%% Part1 %%%
Lambda = 20;  % Lambda:poisson(Lambda)
u = unifrnd(0,1)
M = 0;
while u >= exp(-Lambda)%判定条件
    u = u*unifrnd(0,1);
    M=M+1;
end 
    %取点个数
R = poissrnd(Lambda,1,M) 

%%% Part2 %%%
a = 0; c = 0;
b = 100; d =100;
e = 0; f = 100;     %取[0,100]*[0,100]的布点区域;
Nall = M;
% A = [];
% B = [];
while M > 0         %scatter in the [0,100]*[0,100]
    M = M-1;
    u1 = unifrnd(0,1);
    A(Nall-M) = (b-a)*u1;
    u2 = unifrnd(0,1);
    B(Nall-M) = (d-c)*u2;
    u3 = unifrnd(0,1);
    C(Nall-M) = (f-e)*u3;
    figure(1)    %base stations 分布图
    plot3(A(Nall-M),B(Nall-M),C(Nall-M),'r^');
    hold on;
    plot(A(Nall-M),B(Nall-M),'b.')
    hold on
end
grid on

ppp1

泊松簇过程PCP,参考链接

%泊松簇过程仿真
%父过程
lambda = 10;                       % 密度
M = 0;
U = unifrnd(0,1);

while U >= exp(-lambda)           %判定条件
   U = U*unifrnd(0,1);
   M=M+1;
end 

if M < 1
   M = 1;
end

L = 100;
a = 0;b = L;      %取[0,100]*[0,100]*[0,100]的布点区域;
c = 0;d = L;
A = zeros(1,M);
B = zeros(1,M);
for i = 1:M 
    U1 = unifrnd(0,1);
    A(i) = (b-a)*U1;
    U2 = unifrnd(0,1);
    B(i) = (d-c)*U2;
    plot(A(i),B(i),'r^');
    hold on;
end
grid on;

%子过程
for j=1:M
    n = 50;
    r = 8;
    u1 = zeros(1,n);
    u2 = zeros(1,n);
    R = zeros(1,n);
    x = zeros(1,n);
    y = zeros(1,n);
    theta = zeros(1,n);

    for i = 1:n
        u1(i) = unifrnd(0,1);
    end

    R = r * sqrt(u1);
    R = sort(R);

    for i = 1:n
        u2(i) = unifrnd(0,1);
    end

    theta = 2*pi*u2;

    for i = 1:n
        x(i) = A(j) + R(i) * cos(theta(i));
        y(i) = B(j) + R(i) * sin(theta(i));
    end
    plot(x,y,'.b');
end

axis([-10,110,-10,110]);

PPP2

自己结合的二维泊松点过程后再画Voronoi图的程序(可实现Delaunay三角划分)

%%自己综合的程序,维诺泊松图

%%% Part1 %%%
Lambda = 40;  % Lambda:poisson(Lambda)
u = unifrnd(0,1);
M = 0;
while u >= exp(-Lambda)%判定条件
    u = u*unifrnd(0,1);
    M=M+1;
end 

%%% Part2 %%%
a = 0; c = 0;
b = 100; d =100;     %取[0,100]*[0,100]的布点区域;
Nall = M;
% A = [];
% B = [];
while M > 0         %scatter in the [0,100]*[0,100]
    M = M-1;
    u1 = unifrnd(0,1);
    A(Nall-M) = (b-a)*u1;
    u2 = unifrnd(0,1);
    B(Nall-M) = (d-c)*u2;
    plot(A(Nall-M),B(Nall-M),'r^')
    hold on
end
%%画出voronoi图
voronoi(A',B','--');
%%画出delaunay三角剖分图
%%C=[A' B'];
%%DT=delaunayTriangulation(C);
%%triplot(DT,'r')

poisson_voronoi


本文章使用limfx的vscode插件快速发布