如何在 3-d 单位球面上生成均匀分布的点?

机器算法验证 随机生成
2022-02-02 23:37:35

我想知道如何在 3-d 单位球体的表面上生成均匀分布的点?同样在生成这些点之后,可视化并检查它们在表面 $x^2+y^2+z^2=1$ 上是否真正均匀的最佳方法是什么?

4个回答

一种标准方法是生成三个标准法线并从中构造一个单位向量。即当$X_i \sim N(0,1)$ 和 $\lambda^2 = X_1^2 + X_2^2 + X_3^2$ 时,则 $(X_1/\lambda, X_2/\lambda, X_3/ λ)$ 均匀分布在球面上。这种方法也适用于 $d$ 维球体。

在 3D 中,您可以使用拒绝抽样:从统一的 $[-1,1]$ 分布中抽取 $X_i$,直到 $(X_1, X_2, X_3)$ 的长度小于或等于 1,然后——就像使用前面的方法——将向量归一化为单位长度。每个球面点的预期试验次数等于 $2^3/(4 \pi / 3)$ = 1.91。在更高维度中,预期的试验次数变得如此之大,这很快变得不切实际。

有很多方法可以检查均匀性一种巧妙的方法,尽管计算量较大,但使用Ripley 的 K 函数球体上任何位置的(3D 欧几里德)距离 $\rho$ 内的预期点数与距离 $\rho$ 内的球体面积成正比,即 $\pi\rho^2$。通过计算所有点间距离,您可以将数据与此理想值进行比较。

构建统计图形的一般原则建议进行比较的一个好方法是绘制方差稳定残差 $e_i(d_{[i]} - e_i)$ 对 $i = 1, 2, \ldots, n(n-1 )/2=m$ 其中 $d_{[i]}$ 是相互距离中最小的 $i^\text{th}$ 并且 $e_i = 2\sqrt{i/m}$。情节应该接近于零。(这种方法是非常规的。)

这是使用第一种方法获得的均匀球形分布的 100 次独立绘制的图片:

100个均匀球面点

这是距离的诊断图:

诊断图

y 标度表明这些值都接近于零。

以下是 100 个此类图的累积,以表明哪些尺寸偏差实际上可能是不均匀性的重要指标:

模拟值

(这些图看起来很像布朗桥……这里可能潜伏着一些有趣的理论发现。)

最后,这是一组 100 个均匀随机点加上另外 41 个仅均匀分布在上半球的点的诊断图:

模拟的非均匀值

相对于均匀分布,它显示出一个半球范围内的平均点间距离显着减小。这本身是没有意义的,但这里有用的信息是在一个半球的范围内某些东西是不均匀的。实际上,该图很容易检测到一个半球的密度与另一个不同。(如果您事先知道要从无数个可能的半球中测试哪个半球,那么更简单的卡方检验会更有效。)

这是一些相当简单的R代码

n     <- 100000                  # large enough for meaningful tests
z     <- 2*runif(n) - 1          # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi      # uniform on [-pi, pi]
x     <- sin(theta)*sqrt(1-z^2)  # based on angle
y     <- cos(theta)*sqrt(1-z^2)     

从构造中很容易看出 $x^2+y^2 = 1- z^2$ 所以 $x^2+y^2+z^2=1$ 但是如果需要测试的话

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

并且易于测试 $x$ 和 $y$ 中的每一个都均匀分布在 $[-1,1]$ ($z$ 显然是) 上

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

显然,给定 $z$ 的值,$x$ 和 $y$ 均匀分布在半径为 $\sqrt{1-z^2}$ 的圆周围,这可以通过查看反正切的分布来测试他们的比例。但是由于 $z$ 与 $x$ 和 $y$ 具有相同的边际分布,因此类似的陈述对于任何对都是正确的,并且这也可以进行测试。

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

如果仍然不相信,接下来的步骤将是查看一些任意的 3-D 旋转或有多少点落在给定的立体角内,但这开始变得更加复杂,我认为是不必要的。

如果要对均匀分布在 3D 球体(即 3D 球的表面)上的点进行采样,请使用简单的拒绝,或 Marsaglia 的方法(Ann. Math. Statist., 43 (1972), pp. 645– 646)。对于低维度,拒绝率非常低。

如果要从高维球体和球体中生成随机点,则取决于模拟的目的和规模。如果您不想执行大型模拟,请使用 Muller 的方法(Commun. ACM, 2 (1959), pp. 19-20)或其“球”版本(参见上面引用的 Harman & Lacko 的论文)。那是:

使样本均匀分布在 n 球体(表面)上 1) 从 n 维标准正态分布生成 X 2) 将 X 的每个分量除以 X 的欧几里得范数

获得均匀分布在 n 球(内部)上的样本 1) 从 (n+2) 维标准正态分布生成 X 2) 将 X 的每个分量除以 X 的欧几里德范数并仅取前 n 个分量

如果您想执行大型模拟,那么您应该研究更专业的方法。根据要求,我可以将 Harman 和 Lacko 的关于条件分布方法的论文发送给您,该论文提供了本次讨论中提到的一些算法的分类和概括。联系方式可在我的网站 (http://www.iam.fmph.uniba.sk/ospm/Lacko) 上找到

如果要检查您的点在球的表面或内部是否真正均匀,请查看边缘(所有点都应该相同,因为旋转不变性,投影样本的平方范数是 beta 分布的)。

我在攻读博士学位期间遇到了类似的问题(n-sphere),当地的一位“专家”建议从 n-cube 中进行拒绝采样!当然,这会占用宇宙的年龄,因为我正在以数百的顺序查看 n。

我最终使用的算法非常简单,并发表在:

WP Petersen 和 A. Bernasconic 从 n 球均匀采样:各向同性方法技术报告,TR-97-06,瑞士科学计算中心

我的参考书目中也有这篇论文,我没有看过。您可能会发现它很有用。

Harman, R. & Lacko, V. 关于从 $n$-spheres 和 $n$-balls 进行均匀采样的分解算法 多元分析杂志,2010