Tho*_*Lux 3 random algorithm geometry linear-algebra multidimensional-array
我环顾四周,在单位球上/单位球上生成均匀随机点的所有解决方案都是针对2或3维设计的。
在任意尺寸的球内生成均匀的随机点的(灵活)方法是什么?特别是,不仅限于球的表面。
首先,在多维数据集中生成随机点并抛弃范数大于1的点在高维中是不可行的。高尺寸的单位球体积与单位立方体的体积之比为0。即使在10个维度中,单位立方体中也只有约0.25%的随机点也位于单位球内部。
在d维球中生成均匀分布的随机点的最佳方法似乎是通过考虑极坐标(方向而不是位置)。下面提供了代码。
d。该选择过程将(1)使所有方向均等可能,并且(2)使单位球内的球表面上的所有点均等可能。这将在球的整个内部生成我们所需的均匀随机分布。
为了实现(1),我们可以从d高斯分布的独立绘图中随机生成一个向量,并将其标准化为单位长度。这是有效的,因为高斯分布具有指数分布的概率分布函数(PDF)x^2。这意味着联合分布(对于独立的随机变量,这是其PDF的乘积)将具有(x_1^2 + x_2^2 + ... + x_d^2)指数关系。请注意,这类似于球体在d维上的定义,这意味着d高斯分布中独立样本的联合分布对于旋转是不变的(向量在球体上是均匀的)。
这是2D生成的200个随机点的样子。

为了实现(2),我们可以通过使用累积分布函数(CDF)的逆来生成半径,该函数对应于d半径为的球的表面积r。我们知道n球的表面积与成正比r^d,这意味着我们可以在范围内将其[0,1]用作CDF。现在,通过映射[0,1]逆向范围内的随机数来生成随机样本r^(1/d)。
这是CDF的可视化x^2(对于二维),随机生成的数字[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
Run Code Online (Sandbox Code Playgroud)
为了后代,以下是使用上述代码生成的5000个随机点的图形。

| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |