我已经发布了一个先前的问题,这是相关的,但是我认为最好启动另一个线程。这次,我想知道如何在3-d单位球体内生成均匀分布的点,以及如何从视觉和统计角度检查分布?我看不到那里发布的策略可以直接转移到这种情况。
我已经发布了一个先前的问题,这是相关的,但是我认为最好启动另一个线程。这次,我想知道如何在3-d单位球体内生成均匀分布的点,以及如何从视觉和统计角度检查分布?我看不到那里发布的策略可以直接转移到这种情况。
Answers:
最简单的方法是在相应的超立方体中均匀地采样点,并丢弃不在球体内的点。在3D中,这种情况不应频繁发生,大约有50%的时间。(超立方体的体积为1,球体的体积为)。
您也可以在球坐标系中执行此操作,在这种情况下不会出现拒绝。首先,生成半径和随机的两个角度,然后使用过渡公式来恢复,ÿ和Ž(X = - [R 罪θ 余弦φ,ÿ = - [R 罪θ 罪φ,ž = - [R COS θ)。
您生成 unifomly之间0和2 π。但是,半径r和倾斜角θ并不均匀。的概率的点为半径的球内- [R是- [R 3这样的概率密度函数[R是3 - [R 2。您可以轻松地检查均匀变量的立方根是否具有完全相同的分布,因此这就是生成r的方式。的概率,通过倾斜所定义的球状的圆锥内的点位于θ是(1 - COS θ或 1 - (1 - COS (- θ ))/ 2,如果 θ > π / 2。因此,密度 θ是 š 我Ñ (θ )/ 2。您可以检查减去统一变量的反余弦是否具有正确的密度。
或者更简单地说,我们可以均匀地模拟的余弦在− 1和1之间。
在R中,如下所示。
n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta
在编写和编辑此答案的过程中,我意识到该解决方案比我想象的要简单。
我认为,最简单,最计算有效的方法是遵循@ whuber的方法来生成单位球上所显示这篇文章,并与它们进行缩放[R 。
xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda
d
。为此,替换的所有实例3
的d
。
在我看来,最简单的选择也可以推广到高维球上(这不是球形坐标的情况,甚至拒绝采样的情况更是如此)是生成随机点,它是两个随机变量P = N / |的乘积。 | N | | * ù 1 / Ñ其中Ñ是高斯随机变量(即各向同性的,即指示在任何方向上均匀地)归一化,使得其位于球体和ü这是一个统一的随机变量[ 0 ,1 ]的功率1 /, n是数据的维数,注意半径。
等等!