Self-Study
在磁盤上均勻生成隨機點[重複]
我必須在一個單位磁盤上隨機生成 1000 個點,以便均勻分佈在該磁盤上。現在,為此,我選擇一個半徑 r 和角度方向 α 使得半徑 r 是一個均勻分佈的變量 r∈[0,1] 儘管 α 是一個均勻分佈的變量 α∈[0,2π] 使用以下代碼
r <- runif(1000, min=0, max=1) alpha <- runif(1000, min=0, max=2*pi) x <- r*cos(alpha) y <- r*sin(alpha) plot(x,y, pch=19, col=rgb(0,0,0,0.05), asp=1)
然後我查看我的樣本空間,它看起來像這樣:
這顯然不像磁盤上均勻分佈的樣本。因此,我猜測問題可能是由於變量之間缺乏獨立性而發生的 r 和 α 取決於它們是如何在計算上聯繫起來的。
為了解決這個問題,我編寫了一個新代碼。
rm(list=ls()) r <- runif(32, min=0, max=1) df_res <- data.frame(matrix(c(-Inf, Inf), byrow = T, nrow = 1)) for (i in 1:32) { for (j in 1:32) { alpha <- runif(32, min=0, max=2*pi) r <- runif(32, min=0, max=1) df <- data.frame(matrix(c(r[i],alpha[j]), byrow = T, nrow = 1)) df_res <- rbind(df_res,df) } } df_res <- subset(df_res, df_res$X1 != -Inf) x<- df_res$X1 *cos(df_res$X2) y <- df_res$X1 *sin(df_res$X2) plot(x,y, pch=19, col=rgb(0,0,0,0.05), asp=1)
而且,該樣本再次看起來在磁盤上分佈不均勻
我開始懷疑附近有更深層次的數學問題。有人可以幫我編寫代碼來創建一個均勻分佈在磁盤上的樣本空間,或者在我的推理中解釋數學謬誤嗎?
問題是由於半徑不是均勻分佈的。即,如果 (X,Y) 均勻分佈在 \left{ (x,y);\ x^2+y^2\le 1\right}
那麼變量的(極坐標)變化 R=(X2+Y2)1/2A=sign(Y)arccos(X/R)有密度 $$ \frac{1}{\pi} \mathbb{I}{(0,1)}(r)\left|\frac{\text{d}(X,Y)}{\text{d}(R,A)}(r,\alpha)\right|\mathbb{I}{(0,2\pi)}(\alpha) 使用$x=rcosα$和$y=rsinα$造成\left|\frac{\text{d}(X,Y)}{\text{d}(R,A)}(r,\alpha)\right|=r(\sin^2\alpha+\cos^2\alpha)=r $$ 因此,角度 A 均勻分佈在 (0,2π) 但半徑 R 有密度 f(r)=2rI(0,1)(r) 和 cdf F(r)=r2 超過 (0,1) . 正如一個可以通過運行檢查r <- sqrt(runif(1000, min=0, max=1) ) alpha <- runif(1000, min=0, max=2*pi) x <- r*cos(alpha) y <- r*sin(alpha) plot(x,y, pch=19, col=rgb(0,0,0,0.05), asp=1)
其中半徑由逆 cdf 表示模擬,這使其成為 Uniform 變量的平方根,10³ 模擬點的隨機重新分配與統一兼容: