Mô phỏng phân phối đồng đều trên đĩa


24

Tôi đã cố gắng mô phỏng việc tiêm các điểm ngẫu nhiên trong một vòng tròn, sao cho bất kỳ phần nào của vòng tròn đều có cùng xác suất có khiếm khuyết. Tôi dự kiến ​​số lượng trên mỗi khu vực của phân phối kết quả sẽ tuân theo phân phối Poisson nếu tôi chia vòng tròn thành các hình chữ nhật có diện tích bằng nhau.

Vì nó chỉ yêu cầu đặt các điểm trong một khu vực hình tròn, tôi đã tiêm hai phân phối ngẫu nhiên thống nhất theo tọa độ cực: R (bán kính) và (góc cực).θ

Nhưng sau khi thực hiện tiêm này, tôi rõ ràng nhận được nhiều điểm hơn ở trung tâm của vòng tròn so với cạnh.

nhập mô tả hình ảnh ở đây

Điều gì sẽ là cách chính xác để thực hiện tiêm này trên vòng tròn sao cho các điểm được phân phối ngẫu nhiên trên vòng xoáy?


Câu hỏi này có một sự tương tự chính xác trong diễn đàn Hình học: math.stackexchange.com/questions/87230/ Đổi
Aksakal

Câu trả lời:


35

Bạn muốn tỷ lệ điểm được tỷ lệ đồng đều với diện tích hơn là khoảng cách đến điểm gốc. Vì diện tích tỷ lệ với khoảng cách bình phương, tạo ra bán kính ngẫu nhiên đồng nhất và lấy căn bậc hai của chúng. Kết hợp điều đó với một góc cực đồng đều.

Đây là cách nhanh chóng và đơn giản để viết mã, thực thi hiệu quả (đặc biệt là trên nền tảng song song) và tạo ra chính xác số điểm quy định.

Thí dụ

Đây là Rmã làm việc để minh họa thuật toán.

n <- 1e4
rho <- sqrt(runif(n))
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

nhập mô tả hình ảnh ở đây


3

Từ chối lấy mẫu có thể được sử dụng. Điều này có nghĩa là chúng ta có thể lấy mẫu từ phân phối đồng đều 2D và chọn các mẫu thỏa mãn điều kiện đĩa.

Đây là một ví dụ.

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)

nhập mô tả hình ảnh ở đây


3
Đây là một thay thế tốt cho phương pháp của OP. Đơn giản và hiệu quả. Tuy nhiên, nó không thực sự giải quyết được câu hỏi liên quan đến cách sửa đổi phương pháp tọa độ cực để tạo ra các biến thể phân bố đồng đều. Tại sao chúng ta có thể quan tâm? Do các hàm ý: một khi bạn biết cách tạo các điểm phân bố đồng đều theo tọa độ cực, bạn có thể sử dụng lấy mẫu từ chối (và các phương pháp quen thuộc khác) trong các tọa độ cực để lấy mẫu từ các khu vực có thể rất phức tạp để lấy mẫu theo tọa độ Cartesian (nghĩ về hypocycloids , ví dụ).
whuber

1
π/4

@whuber cảm ơn vì đã giáo dục tôi bằng cách bình luận câu trả lời của tôi!
Haitao Du

3

Tất nhiên, tôi cũng sẽ cung cấp cho bạn một câu trả lời n chiều chung phù hợp với trường hợp hai chiều. Trong ba chiều, một tương tự của một đĩa là một thể tích của một quả bóng rắn (hình cầu).

Có hai cách tiếp cận tôi sẽ thảo luận. Một trong số đó tôi sẽ gọi là "chính xác" , và bạn sẽ nhận được một giải pháp hoàn chỉnh với nó trong R. Thứ hai tôi gọi là heuristic , và đó chỉ là ý tưởng, không có giải pháp hoàn chỉnh nào được cung cấp.

Giải pháp "chính xác"

Giải pháp của tôi dựa trên các tác phẩm của Marsaglia và Muller . Về cơ bản, nó xảy ra sao cho vectơ Gaussian được chuẩn hóa theo định mức của nó sẽ cung cấp cho bạn các điểm phân bố đồng đều trên một siêu cầu d chiều:

nhập mô tả hình ảnh ở đây

d1/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")

nhập mô tả hình ảnh ở đây

Đây là một đoạn mã cho trường hợp 3d, tức là một quả bóng rắn:

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])

nhập mô tả hình ảnh ở đây

Cách tiếp cận heuristic

Vn(R)= =πn2Γ(n2+1)Rn
Rn

Σtôi= =1dxtôi2<R2

1d+2


@Silverfish, bạn nói đúng, tôi đã sửa ngôn ngữ
Aksakal

@Silverfish, nó chậm do sử dụng các biến thể Gaussian, nhưng có thể nhanh hơn so với lấy mẫu từ chối đơn giản trong trường hợp chiều cao, điều này không rõ ràng đối với nhiều người, mặc dù đó là một chủ đề khác
Aksakal

1/d,d

@whuber, tôi đã sao chép dán, sửa một lỗi đánh máy trên sức mạnh khối lập phương. Nếu chúng ta sử dụng Gaussian thì việc lấy mẫu từ chối sẽ không tốt hơn, vì vậy chúng ta phải sử dụng thứ gì đó có hình chuông nhanh hơn Gaussian, bạn đã đúng
Aksakal

0

Đây là một giải pháp thay thế trong 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")

nhập mô tả hình ảnh ở đây


4
Bạn có thể giải thích câu trả lời này bằng tiếng Anh không? Chúng tôi không thực sự là một trang web trợ giúp mã, và các câu trả lời chỉ dành cho mã nên được khuyến khích.
gung - Phục hồi Monica

5
01r <- seq(0, 1, by=1/10)

1
@whuber Cảm ơn bạn đã chỉ ra rằng. Nó thực sự là ý tưởng chính của tôi về giải pháp. Cách tiếp cận của tôi là tạo ra nhiều vòng tròn đồng nhất với bán kính khác nhau và đối với mỗi vòng tròn, số điểm tỷ lệ thuận với độ dài bán kính của nó. Do đó, trên một đơn vị chiều dài của các vòng tròn có bán kính khác nhau, số lượng điểm là như nhau. Để tránh tính chất rời rạc, chúng tôi có thể lấy mẫu rtừ Đồng phục (0,1).
Q_Li
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.