이전 질문 을 게시 했지만 관련이 있지만 다른 스레드를 시작하는 것이 좋습니다. 이번에는 3 차원 단위 구 내부에 균일하게 분포 된 점을 생성하는 방법과 시각적 및 통계적으로 분포를 확인하는 방법이 궁금합니다. 거기에 게시 된 전략이이 상황으로 직접 양도 될 수는 없습니다.
이전 질문 을 게시 했지만 관련이 있지만 다른 스레드를 시작하는 것이 좋습니다. 이번에는 3 차원 단위 구 내부에 균일하게 분포 된 점을 생성하는 방법과 시각적 및 통계적으로 분포를 확인하는 방법이 궁금합니다. 거기에 게시 된 전략이이 상황으로 직접 양도 될 수는 없습니다.
답변:
가장 쉬운 방법은 해당 하이퍼 큐브에서 균일하게 점을 샘플링하여 구 내에 있지 않은 점을 버리는 것입니다. 3D에서, 이것은 종종 약 50 %의 시간에 일어나지 않아야합니다. (하이 큐브의 부피는 1이고, 구의 부피는 입니다.)
구면 좌표에서도이를 수행 할 수 있으며,이 경우 거부가 없습니다. 먼저 반경과 두 각도를 무작위로 생성 한 다음 전이 공식을 사용하여 , 및 ( , , ).y z x = r sin θ cos ϕ y = r sin θ sin ϕ z = r cos θ
과 사이에서 생성 합니다. 반경 과 기울기 는 일정하지 않다. 포인트는 반지름의 볼 내부 확률 이고 의 확률 밀도 함수 있도록 인 . 균일 변수의 세제곱근이 정확히 같은 분포를 갖는지 쉽게 확인할 수 있으므로 을 생성 할 수 있습니다 . 구형 콘 내의 포인트 거짓 경사에 의해 정의 된 확률 IS 또는 만약 . 따라서 밀도 는 입니다. 균일 변수의 아크 코사인을 빼면 적절한 밀도가 있는지 확인할 수 있습니다.
또는 간단히 말해, 의 코사인을 균일하게 과 시뮬레이션 할 수 있습니다 .
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의 방법에 따라이 게시물에 표시된 것처럼 단위 구에서 를 생성 하고 스케일링하는 것입니다 .
xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda
d
. 이를 위해의 모든 인스턴스를로 3
바꿉니다 d
.
제 생각에, 더 높은 차원의 볼로도 일반화되는 가장 쉬운 옵션은 (구형 좌표의 경우가 아니고 거부 샘플링의 경우에는 적습니다) 두 개의 랜덤 변수 랜덤 포인트 를 생성 하는 것입니다. 여기서, 가우스 랜덤 변수 (즉, 등방성, 즉 균일하게 임의의 방향으로 가리키는)가 구에 놓 이도록 정규화 에서 균일 확률 변수 받는 power , 은 반경을 고려하여 데이터의 차원입니다.P = N / | | N | | ∗ U 1 / n N U [ 0 , 1 ] 1 / n n
vo!