我环顾四周,并在单位球/生成均匀随机点所有的解决方案是专为2个或3个维度。
什么是(易处理)的方式来产生任意尺寸的球内均匀分布的随机点?特别是,不只是球的表面上。
到序言,在立方体中产生随机点和具有范数大于1抛出点不处于高维可行的。一个单元球在高维的单位立方体的体积的体积的比率变为0。即使在10个尺寸只有约0.25%的单位立方体随机点也单位球内部。
产生在d
维球均匀分布的随机点的最好办法似乎是由极坐标(方向而不是位置)的思考。代码如下。
d
维度半径的球的表面积的随机半径。这种选择过程将(1)使所有方向上同等地可能的是,和(2)使该单位球同样有可能内的球的表面上的所有点。这将产生在球的整个内部我们所期望的均匀随机分布。
为了实现(1),我们可以随机生成一个矢量从d
独立绘制一个高斯分布归一化到单位长度的。 This works因为Gausssian分布与指数x^2
的概率分布函数(PDF)。这意味着,联合分布(独立随机变量,这是他们的PDF文件的乘法)将有(x_1^2 + x_2^2 + ... + x_d^2)
在指数。注意到类似于在d维的球的定义,从高斯分布意味着d
独立样本的联合分布是不变的旋转(载体是均匀的球体)。
这里是什么产生200个随机点在2D的模样。
为了实现(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
)
最后,这里是计算所有上述的一些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个的随机点。