【问题标题】:How to generate uniform random points inside d-dimension ball / sphere?如何在 d 维球/球内生成均匀的随机点?
【发布时间】:2019-06-29 21:29:20
【问题描述】:

我环顾四周,所有用于在单位球中/上生成均匀随机点的解决方案都是为 2 或 3 维设计的。

什么是(易于处理)在任意尺寸的球内部生成均匀随机点的方法?尤其是,不仅仅是在表面上球。

首先,在立方体中生成随机点并丢弃范数大于 1 的点在高维中不可行。单位球的体积与单位立方体的体积之比在高维中趋于 0。即使在 10 维中,单位立方体中也只有大约 0.25% 的随机点也在单位球内。

【问题讨论】:

  • 感谢您的链接!但是,这不是一个完整的解决方案。这会在 球上生成点。我的问题是如何在球 in 中生成分数。我将在问题中添加注释以进一步澄清。 (您可以查看下面解决方案中的图片 1 和 3,以了解您提供的链接与我要求的链接之间的区别)

标签: algorithm multidimensional-array random geometry linear-algebra


【解决方案1】:

d-dimension 球中生成均匀分布的随机点的最佳方法似乎是考虑极坐标(方向而不是位置)。 代码如下。

  1. 在单位球上随机选取一个分布均匀的点。
  2. 选择一个随机半径,其中半径的可能性对应于该半径在d 维度中的球的表面积

此选择过程将 (1) 使所有方向均等,并且 (2) 使单位球内球表面上的所有点均等可能。这将在球的整个内部产生我们想要的均匀随机分布。

选择一个随机方向(在单位球上)

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

这是在 2D 中生成的 200 个随机点的样子。


选择一个随机半径(以适当的概率)

为了实现 (2),我们可以使用累积分布函数 (CDF) 的逆函数生成半径,该函数对应于半径为 d 的球的表面积r。我们知道surface area of an n-ballr^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 个随机点的视觉效果。

【讨论】:

  • 您能指定该代码的语言吗?还可能想弄清楚如何用算法、游戏开发、几何来标记它,否则可能很难找到这个优雅的解决方案。
  • 谢谢,我有算法和几何。我只能有 5 个标签。
  • 请注意,在此答案的术语中,“单位球上”的点(与“单位球内的点”相反)是单位球体的一个元素.
  • @AdomasBaliuka 我认为“sphere”是专门为 3D 空间保留的术语。泛化为任意维度的点和半径定义的形状的术语是“ball”。
  • @Thomas Lux 至少在数学中,在任意维度上使用术语“球体”是标准的。它的意思是“球的表面”。
猜你喜欢
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 2021-07-20
  • 2011-07-21
  • 2019-06-13
  • 2020-09-23
  • 2020-05-14
  • 2018-03-31
相关资源
最近更新 更多