如何生成d维球/球内均匀分布的随机点?

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

我环顾四周,并在单位球/生成均匀随机点所有的解决方案是专为2个或3个维度。

什么是(易处理)的方式来产生任意尺寸的球内均匀分布的随机点?特别是,不只是球的表面上。

到序言,在立方体中产生随机点和具有范数大于1抛出点不处于高维可行的。一个单元球在高维的单位立方体的体积的体积的比率变为0。即使在10个尺寸只有约0.25%的单位立方体随机点也单位球内部。

algorithm multidimensional-array random geometry linear
1个回答
7
投票

产生在d维球均匀分布的随机点的最好办法似乎是由极坐标(方向而不是位置)的思考。代码如下。

  1. 挑上具有均匀分布的单元球的随机点。
  2. 挑其中半径的可能性对应于与在d维度半径的球的表面积的随机半径。

这种选择过程将(1)使所有方向上同等地可能的是,和(2)使该单位球同样有可能内的球的表面上的所有点。这将产生在球的整个内部我们所期望的均匀随机分布。

Picking a random direction (on the unit ball)

为了实现(1),我们可以随机生成一个矢量从d独立绘制一个高斯分布归一化到单位长度的。 This works因为Gausssian分布与指数x^2的概率分布函数(PDF)。这意味着,联合分布(独立随机变量,这是他们的PDF文件的乘法)将有(x_1^2 + x_2^2 + ... + x_d^2)在指数。注意到类似于在d维的球的定义,从高斯分布意味着d独立样本的联合分布是不变的旋转(载体是均匀的球体)。

这里是什么产生200个随机点在2D的模样。


Picking a random radius (with appropriate probability)

为了实现(2),我们可以通过使用累积分布函数(CDF),它对应于与半径d r尺寸的球的表面积的倒数产生的半径。我们知道,surface area of an n-ball成正比r^d,这意味着我们可以用这个在范围[0,1]作为CDF。现在一个随机样本是通过逆,[0,1]范围r^(1/d)映射的随机数生成。

这里是一个视觉x^2的CDF(对于两个维度)的,在随机[0,1]生成的数字将得到映射到相应的x坐标该曲线上。 (例如.1.317


Code for the above

最后,这里是计算所有上述的一些Python代码(假设你已经安装NumPy的)。

# Generate "num_points" random points in "dimension" that have uniform
# probability over the unit ball scaled by "radius" (length of points
# are in range [0, "radius"]).
def random_ball(num_points, dimension, radius=1):
    from numpy import random, linalg
    # First generate random directions by normalizing the length of a
    # vector of random-normal values (these distribute evenly on ball).
    random_directions = random.normal(size=(dimension,num_points))
    random_directions /= linalg.norm(random_directions, axis=0)
    # Second generate a random radius with probability proportional to
    # the surface area of a ball with a given radius.
    random_radii = random.random(num_points) ** (1/dimension)
    # Return the list of random (direction & length) points.
    return radius * (random_directions * random_radii).T

为后代,这里是一个视觉的与上面的代码生成5000个的随机点。

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