Answers:
可以使用拒绝采样。这意味着我们可以从2D均匀分布中采样,然后选择满足光盘条件的采样。
这是一个例子。
x=runif(1e4,-1,1)
y=runif(1e4,-1,1)
d=data.frame(x=x,y=y)
disc_sample=d[d$x^2+d$y^2<1,]
plot(disc_sample)
当然,我也将为您提供适用于二维情况的一般n维答案。在三个维度上,磁盘的类似物是实心球(球)的体积。
我将讨论两种方法。其中一个我称为“精确”,在R中您将获得一个完整的解决方案。第二个我称为启发式,这只是一个主意,没有提供完整的解决方案。
我的解决方案基于Marsaglia和Muller的作品。基本上会发生这种情况,以便规范化到其范数的高斯向量将为您提供d维超球面上的均匀分布点:
n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")
这是3D外壳的代码片段,即实心球:
library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk
d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
scatterplot3d(x[,1], x[,2], x[,3])
我建议的解决方案是使用拒绝采样对中心附近的点进行过采样。事实证明,如果您从球内部观看随机均匀样本的笛卡尔坐标之一,则其分布将收敛为方差为的高斯
这是以下方面的替代解决方案R
:
n <- 1e4
## r <- seq(0, 1, by=1/1000)
r <- runif(n)
rho <- sample(r, size=n, replace=T, prob=r)
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")
r
从Uniform(0,1)中采样。