3 차원 유닛 볼에서 균일하게 분포 된 점을 생성하는 방법은 무엇입니까?


11

이전 질문 을 게시 했지만 관련이 있지만 다른 스레드를 시작하는 것이 좋습니다. 이번에는 3 차원 단위 구 내부에 균일하게 분포 된 점을 생성하는 방법과 시각적 및 통계적으로 분포를 확인하는 방법이 궁금합니다. 거기에 게시 된 전략이이 상황으로 직접 양도 될 수는 없습니다.


4
이전 질문의 기술 은 원점의 거리 내에있는 점의 수가 비례해야 한다는 것을 관찰하면 바로 적용됩니다 . 는 독립적 균일 변량 따라서 생성하는 경우 의 포인트와 함께 스케일링 구의 표면에 하여 트릭 않습니다. , R 3 U를 [ 0 , 1 ] w w U 1 / 3rr3u[0,1]wwu1/3
whuber

@ whuber : 어쩌면 이전 기술의 본질을 얻지 못했습니다. 당신이 묘사 한 것을 시도하겠습니다. 또한 여기에서 균일 성을 다시 확인하는 방법은 무엇입니까?
Qiang Li

2
@ Qiang Ripley의 K 함수 및 카이 제곱 테스트. 구 표면의 점들의 방사상 투영의 균일 성, 점의 길이의 입방체의 균일 성 및 그 두 가지의 독립성을 확인할 수도 있습니다.
whuber

나에게있어, "균일하게 분포 된"이 무엇을 의미하는지는 분명하지 않다. 아마도 그것을 정의하려는 시도는 자동적으로 생성 알고리즘을 생성 할 것이다 (=

@mbq, 용어를 정의하려면 의 pdf가 필요합니다 . fR,Θ,Φ(r,θ,ϕ)=r2
Qiang Li

답변:


14

가장 쉬운 방법은 해당 하이퍼 큐브에서 균일하게 점을 샘플링하여 구 내에 있지 않은 점을 버리는 것입니다. 3D에서, 이것은 종종 약 50 %의 시간에 일어나지 않아야합니다. (하이 큐브의 부피는 1이고, 구의 부피는 입니다.)43πr3=0.523...


+1. 이것은 comp.graphics.algorithms FAQ "구상의 균일 한 임의의 점"
David Cary

1
대해 그렇게하려면 어떻게해야 합니까? n>100
ares

2
이것을 "거부 방법"이라고합니다. 27 차원으로 3 차원에서 잘 작동하는 동안, 1 조 포인트 중 1 개만 27- 볼에 있고 나머지 27- 큐브에는 있지 않으므로 거부 방법이 잘 일반화되지 않습니다. 나는 현재 2,440 차원의 공에서 균일하게 샘플이 필요하기 때문에 이것을 언급합니다.
Reb. Cabin

13

구면 좌표에서도이를 수행 할 수 있으며,이 경우 거부가 없습니다. 먼저 반경과 두 각도를 무작위로 생성 한 다음 전이 공식을 사용하여 , 및 ( , , ).y z x = r sin θ cos ϕ y = r sin θ sin ϕ z = r cos θxyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

과 사이에서 생성 합니다. 반경 과 기울기 는 일정하지 않다. 포인트는 반지름의 볼 내부 확률 이고 의 확률 밀도 함수 있도록 인 . 균일 변수의 세제곱근이 정확히 같은 분포를 갖는지 쉽게 확인할 수 있으므로 을 생성 할 수 있습니다 . 구형 콘 내의 포인트 거짓 경사에 의해 정의 된 확률 IS 또는 만약ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2 . 따라서 밀도 는 입니다. 균일 변수의 아크 코사인을 빼면 적절한 밀도가 있는지 확인할 수 있습니다.θsin(θ)/2

또는 간단히 말해, 의 코사인을 균일하게 과 시뮬레이션 할 수 있습니다 .θ11

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의 방법에 따라이 게시물에 표시된 것처럼 단위 구에서 를 생성 하고 스케일링하는 것입니다 .(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
거부가 없기 때문에 훨씬 더 나은 대답입니다. 고차원 공간에서, 거부 확률은 수용 확률이 낮기 때문에 비용이 많이들 수 있습니다.
kingledion

2
코드의 마지막 비트는 더 높은 차원에 맞춰질 수 있습니다 d. 이를 위해의 모든 인스턴스를로 3바꿉니다 d.
gui11aume

0

제 생각에, 더 높은 차원의 볼로도 일반화되는 가장 쉬운 옵션은 (구형 좌표의 경우가 아니고 거부 샘플링의 경우에는 적습니다) 두 개의 랜덤 변수 랜덤 포인트 를 생성 하는 것입니다. 여기서, 가우스 랜덤 변수 (즉, 등방성, 즉 균일하게 임의의 방향으로 가리키는)가 구에 놓 이도록 정규화 에서 균일 확률 변수 받는 power , 은 반경을 고려하여 데이터의 차원입니다.P = N / | | N | | U 1 / n N U [ 0 , 1 ] 1 / n nPP=N/||N||U1/nNU[0,1]1/nn

vo!


2
균일하게 분산 반경은 ... 공의 균일 한 점을주지 않을 것이다
할보 르센 kjetil B

1
진실. 저밀도 / 고밀도 영역을 고려 하려면 변수 의 분포를 약간 조정해야합니다 . U
Jean-Luc Bouchot 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.