我环顾四周,所有在单位球上产生均匀随机点的解都是为2维或3维设计的。
什么是(可处理的)方法来生成均匀的随机点,在中生成一个任意维的球?特别是在球的表面上。
前言中,在立方体中生成随机点并剔除范数大于1的点在高维情况下是不可行的。在高维中,单位球的体积与单位立方体的体积之比为0。即使在10个维度中,单位立方体中的随机点也只有0.25%左右在单位球内。
发布于 2019-02-06 00:14:20
在d-dimension球中生成均匀分布的随机点的最佳方法似乎是考虑极坐标(方向而不是位置)。代码如下所示.
d维数。这一选择过程将(1)使所有方向的可能性相等,(2)使球的表面上的所有点在单位球内的可能性相等。这将产生我们想要的均匀随机分布在整个球的内部。
选择一个随机方向(在单位球上)
为了达到(1),我们可以随机生成一个向量,由d独立绘制的高斯分布归一化为单位长度。这行得通是因为高斯分布有一个概率分布函数( x^2 ),它以指数形式存在。这意味着联合分布(对于独立的随机变量,这是它们的PDF的乘积)将在指数中有(x_1^2 + x_2^2 + ... + x_d^2)。注意,这类似于d维中球的定义,这意味着来自高斯分布的d独立样本的联合分布对旋转是不变的(矢量在球面上是一致的)。
以下是在2D中生成的200个随机点的样子。

选择随机半径(以适当的概率)
为了达到(2),我们可以利用与d维数中的球的表面积对应的半径r的累积分布函数的逆来生成半径。我们知道N-球的表面积与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点随机点的视觉效果。

https://stackoverflow.com/questions/54544971
复制相似问题