如何在d维球球内部生成均匀的随机点?

如何在d维球球内部生成均匀的随机点?,第1张

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

d
维球中生成均匀分布的随机点的最佳方法似乎是通过考虑极坐标(方向而不是位置)。 下面提供了代码。

  1. 在单位球上选择一个均匀分布的随机点。
  2. 选择一个随机半径,其中半径的似然性对应于具有该半径尺寸的球的 表面积
    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

为了后代,以下是使用上述代码生成的5000个随机点的图形。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5008353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存