디스크에서 균일 한 분포를 시뮬레이션


24

원의 임의의 부분에 결함이있을 확률이 동일하도록 원 내 임의의 점 주입을 시뮬레이션하려고했습니다. 원을 같은 면적의 사각형으로 나누면 결과 분포의 면적 당 개수가 포아송 분포를 따를 것으로 예상했습니다.

원형 영역 내에 점을 배치하기 만하면되기 때문에 극좌표에 아르 자형 (반경)과 θ (극각 )의 두 개의 균일 한 랜덤 분포를 주입했습니다 .

그러나이 주입을 한 후에는 원의 중심에서 가장자리에 비해 더 많은 점을 분명히 얻습니다.

여기에 이미지 설명을 입력하십시오

점이 cirlce에 무작위로 분포되도록 원을 가로 질러이 주입을 수행하는 올바른 방법은 무엇입니까?


이 질문은 형상 포럼에서 정확한 아날로그를 가지고 있습니다 : math.stackexchange.com/questions/87230/…
Aksakal

답변:


35

점의 비율 이 원점까지의 거리가 아닌 면적에 균일하게 비례하기를 원합니다 . 면적은 제곱 거리에 비례하기 때문에 균일 한 랜덤 반지름을 생성 하고 제곱근을 취합니다. 균일 한 극 각과 결합하십시오.

이는 코딩이 빠르고 간단하며, 특히 병렬 플랫폼에서 효율적으로 실행되며, 규정 된 포인트 수를 정확하게 생성합니다.

R알고리즘을 설명하기 위해 작동하는 코드입니다.

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

여기에 이미지 설명을 입력하십시오


3

거부 샘플링을 사용할 수 있습니다. 즉, 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)

여기에 이미지 설명을 입력하십시오


3
이것은 OP가 취한 접근법에 대한 좋은 대안입니다. 간단하고 효율적입니다. 그러나 극좌표 방법을 수정하여 균일하게 분포 된 변량을 생성하는 방법에 관한 문제는 실제로 다루지 않습니다. 우리는 왜 걱정할 수 있습니까? 의미 : 극좌표에 균일하게 분포 된 점을 생성하는 방법을 알고 나면 극좌표에서 거부 샘플링 (및 기타 친숙한 방법) 을 사용 하여 직교 좌표로 샘플링하기가 매우 복잡한 영역에서 샘플링 할 수 있습니다 (하이 사이클로이드 생각) 예를 들어).
whuber

1
π/4

@ whuber 내 답변에 댓글을 달아 교육시켜 주셔서 감사합니다!
Haitao Du

3

물론 2 차원 경우에도 작동하는 일반적인 n 차원 답변을 드릴 것입니다. 3 차원에서 디스크의 아날로그는 솔리드 볼 (구)의 부피입니다.

내가 논의 할 두 가지 접근법이 있습니다. 그중 하나는 "precise" 라고 부르며 R에서 그와 함께 완벽한 솔루션을 얻게 될 것입니다. 두 번째는 휴리스틱 (heuristic ) 이라고 하며 아이디어 일 뿐이며 완전한 솔루션은 제공되지 않습니다.

"정확한"솔루션

내 솔루션은 Marsaglia와 Muller의 작품을 합니다 . 기본적으로, 표준으로 정규화 된 가우스 벡터는 d 차원 초구에 균일하게 분포 된 점을 제공합니다.

여기에 이미지 설명을 입력하십시오

1/ 적절한 분포의 반지름을 얻기 위해 균일 한 난수를 의 . 다음은 2 차원에 대한 R의 전체 코드입니다.이 코드는 여러 차원으로 쉽게 확장 할 수 있습니다.

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

여기에 이미지 설명을 입력하십시오

휴리스틱 접근법

V(아르 자형)=π2Γ(2+1)아르 자형
아르 자형

나는=1엑스나는2<아르 자형2

1+2


@ Silverfish, 당신 말이 맞아, 나는 언어를 고쳤다
Aksakal

@Silverfish, 가우스 변형을 사용하여 속도가 느리지 만, 고차원의 경우 단순한 거부 샘플링보다 빠를 수 있습니다. 이는 다른 주제이지만 많은 사람들에게는 분명하지 않습니다
Aksakal

1/,

@ whuber, 나는 복사 붙여 넣기를하고 큐브의 오타를 수정했습니다. 우리가 가우스를 사용하는 경우 우리는 빠른 가우스보다 사용 뭔가 벨 모양해야 할 것이다, 그래서 다음 거부 샘플링이 아닌 더 나은, 당신 맞아요
Aksakal

0

다음은 대체 솔루션입니다 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")

여기에 이미지 설명을 입력하십시오


4
이 답변을 일반 영어로 설명 할 수 있습니까? 우리는 실제로 코드 도움말 사이트가 아니며 코드 전용 답변은 권장하지 않습니다.
gung-복직 모니카

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

1
@whuber 지적 해 주셔서 감사합니다. 실제로 솔루션에 대한 나의 주요 아이디어입니다. 내 접근 방식은 다양한 반경을 가진 많은 균일 한 원을 생성하는 것이 었으며 각 원의 경우 점의 수는 반경의 길이에 비례합니다. 따라서 반지름이 다른 원의 단위 길이에서 포인트 수는 동일합니다. 불연속 특성을 피하기 위해 rUniform (0,1)에서 샘플링 할 수 있습니다.
Q_Li
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.