3 차원 단위 구의 표면에 균일하게 분포 된 점을 생성하는 방법이 궁금합니다. 또한 이러한 점을 생성 한 후 표면에서 실제로 균일한지 여부를 시각화하고 확인하는 가장 좋은 방법은 무엇 입니까?
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
다음과 v = v/v.norm(10000)
3 차원 단위 구의 표면에 균일하게 분포 된 점을 생성하는 방법이 궁금합니다. 또한 이러한 점을 생성 한 후 표면에서 실제로 균일한지 여부를 시각화하고 확인하는 가장 좋은 방법은 무엇 입니까?
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
다음과 v = v/v.norm(10000)
답변:
표준 방법은 세 가지 표준 법선을 생성하고 이들로부터 단위 벡터를 구성하는 것입니다. 즉, 및 인 경우 는 균일합니다. 구체에 분배. 이 방법은 차원 구체 에도 잘 작동합니다 .λ (2) = X (2) (1) + X (2) (2) + X (2) (3) ( X 1 / λ , X 2 / λ , X 3 / λ ) D
3D에서는 거부 샘플링을 사용할 수 있습니다. 의 길이 가 1보다 작거나 같을 때까지 균일 한 분포 에서 를 그립니다. 벡터를 단위 길이로 정규화합니다. 구면 포인트 당 예상 시행 횟수는 = 1.91입니다. 더 큰 차원에서 예상되는 시행 횟수는 너무 커져서이를 실현할 수 없게됩니다. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) (2) (3) / ( 4 π / 3 )
균일 성을 확인하는 방법에는 여러 가지가 있습니다 . 계산적으로 다소 집중적이지만 깔끔한 방법은 Ripley의 K 함수를 사용하는 것 입니다. 구의 모든 위치 에서 (3D 유클리드) 거리 내 예상 포인트 수는 거리 내에있는 구의 면적에 비례하며 이는 와 같습니다 . 모든 인터 포인트 거리를 계산함으로써 데이터를이 이상과 비교할 수 있습니다.ρ π ρ 2
통계 그래픽을 구성하는 일반적인 원칙은 비교를위한 좋은 방법은 대해 분산 안정화 잔차 를 그리는 것입니다 여기서 는 상호 거리 중 가장 작은 이며 입니다. 플롯은 0에 가까워 야합니다. (이 접근 방식은 기존과 다릅니다.)내가 = 1 , 2 , ... , N ( N - 1 ) / 2 = m의 D [ I ] I 번째 즉 I = 2 √
다음은 첫 번째 방법으로 얻은 균일 한 구면 분포에서 100 개의 독립적 인 그림을 보여줍니다.
거리의 진단 플롯은 다음과 같습니다.
y 스케일은이 값이 모두 0에 가깝다는 것을 나타냅니다.
다음은 실제로 어떤 크기 편차가 실제로 불균일성을 나타내는 중요한 지표가 될 수 있는지를 보여주기 위해 100 개의 플롯을 축적 한 것입니다.
(이 음모는 브라운 다리 와 같이 끔찍한 것처럼 보입니다 ... 여기에 흥미로운 이론적 발견이있을 수 있습니다.)
마지막으로, 100 개의 균일 한 랜덤 포인트와 상위 반구에만 균일하게 분포 된 41 개의 포인트에 대한 진단 플롯이 있습니다.
균일 한 분포와 비교하여 평균 반점 거리가 한 반구 범위로 크게 감소한 것을 보여줍니다 . 그것은 그 자체로는 의미가 없지만, 여기서 유용한 정보는 어떤 것이 하나의 반구 규모에서 불균일하다는 것입니다. 실제로이 그림은 한 반구가 다른 반구와 다른 밀도를 가지고 있음을 쉽게 감지합니다. (가장 많은 카이 제곱 테스트 를 통해 가능한 많은 반구를 테스트 할 반구를 미리 알고 있다면 더 많은 카이 제곱 검정을 통해 더 많은 검정력을 사용할 수 있습니다.)
약간 간단한 R 코드가 있습니다.
n <- 100000 # large enough for meaningful tests
z <- 2*runif(n) - 1 # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi # uniform on [-pi, pi]
x <- sin(theta)*sqrt(1-z^2) # based on angle
y <- cos(theta)*sqrt(1-z^2)
구성에서 및 임을 확인하는 것은 매우 간단 하지만 테스트해야 할 경우x 2 + y 2 + z 2 = 1
mean(x^2+y^2+z^2) # should be 1
var(x^2+y^2+z^2) # should be 0
와 가 각각 에 균일하게 분포되어 있는지 ( 분명히)의 Y [ - 1 , 1 ] Z
plot.ecdf(x) # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)
명백하게, 소정의 값 , 및 균일 반경의 원의 주위에 분산되어 이 자신의 비의 아크 탄젠트의 분포를 보면 시험 할 수있다. 그러나 는 와 와 같은 한계 분포를 갖기 때문에 모든 쌍에 대해 유사한 설명이 적용되며,이 역시 테스트 할 수 있습니다. x y √ zxy
plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))
여전히 확실하지 않은 경우 다음 단계는 임의의 3D 회전 또는 주어진 솔리드 각도 내에 몇 개의 포인트가 떨어지는 지 살펴 보는 것이지만 더 복잡해지기 때문에 불필요하다고 생각합니다.
3D 구체 (즉, 3D 공의 표면)에 균일하게 분포 된 점을 샘플링하려면 간단한 거부 또는 Marsaglia 방법 (Ann. Math. Statist., 43 (1972), 645-pp)을 사용하십시오. 646). 치수가 낮 으면 제거율이 매우 낮습니다.
더 높은 차원의 구와 공에서 임의의 점을 생성하려면 시뮬레이션의 목적과 규모에 따라 다릅니다. 큰 시뮬레이션을 수행하지 않으려면 Muller (Commun. ACM, 2 (1959), 19–20 페이지) 또는 "공"버전 (위에서 인용 한 Harman & Lacko의 논문 참조) 방법을 사용하십시오. 그건:
n-sphere (표면)에 균일하게 분포 된 샘플을 얻으려면 1) n- 차원 표준 정규 분포에서 X 생성 2) X의 각 성분을 X의 유클리드 규범으로 나눕니다.
n- 볼 (내부)에 균일하게 분포 된 샘플을 얻기 위해 1) (n + 2) 차원 표준 정규 분포에서 X 생성 2) X의 각 성분을 X의 유클리드 표준으로 나누고 처음 n 개의 성분 만 취함
대규모 시뮬레이션을 수행하려면보다 전문화 된 방법을 조사해야합니다. 요청에 따라 조건부 분포 방법에 대한 Harman과 Lacko의 논문을 보내드릴 수 있으며,이 토론에서 언급 한 일부 알고리즘의 분류 및 일반화를 제공합니다. 연락처는 내 웹 사이트 (http://www.iam.fmph.uniba.sk/ospm/Lacko)에서 확인할 수 있습니다.
공의 표면 또는 내부에서 점이 실제로 균일한지 여부를 확인하려면 한계 값을 살펴보십시오 (회전 불변으로 인해 투영 된 샘플의 제곱 표준은 베타 분포 임).
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
다음과 v = v/v.norm(10000)
박사 과정에서 비슷한 문제 (n-sphere)가 있었고 지역 '전문가'중 하나가 n-cube에서 거부 샘플링을 제안했습니다! 물론 이것은 내가 hunderds의 순서로 n을 보면서 우주의 나이를 가져 갔을 것입니다.
내가 사용한 알고리즘은 매우 간단하며 다음과 같이 게시됩니다.
n-sphere에서 WP Petersen 및 A. Bernasconic Uniform 샘플링 : 등방성 분석법 기술 보고서, TR-97-06, 스위스 과학 컴퓨팅 센터
또한 내가 보지 않은 참고 문헌에이 논문이 있습니다. 유용 할 수 있습니다.
Harman, R. & Lacko, V. spheres 및 balls 에서 균일 한 샘플링을위한 분해 알고리즘에 관한 연구 다변량 분석 저널, 2010n
나는 전에이 문제를 겪었으며 여기에 내가 찾은 대안이 있습니다.
분포 자체에 관해서는, 내가 제대로 작동하는 공식은 극좌표를 사용하는 것입니다 (실제로 개발 된 극좌표의 변형을 사용함). 직교 좌표로 변환하십시오.
반경은 물론 당신이 플로팅하는 구의 반경입니다. 그런 다음 평평한 평면에서 각도에 대한 두 번째 값과 그 평면 위 또는 아래의 각도 인 세 번째 값이 있습니다.
적절한 분포를 얻으려면 U는 균일하게 분포 된 난수이고 r은 반경이고 a는 두 번째 극좌표이고 b는 세 번째 극좌표라고 가정합니다.
a = U * 360 b = U + U-1 그런 다음 x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b) 를 통해 직교 변환
나는 최근 수학적으로 더 나은 다음을 발견했다 .a = 2 (pi) * U b = cos ^ -1 (2U-1)
비록 내 것이도 대 라디안이지만 실제로 내 원래 공식과 크게 다르지 않습니다.
이 최신 버전은 하이퍼 스피어에 사용될 수 있지만이를 달성하는 방법에 대한 언급은 없습니다.
Homeworld 2 용 맵을 만든 다음 그 맵을 "재생"하는 다소 저렴한 방법으로 시각적으로 균일 성을 확인했지만. 실제로,지도는 루아 스크립트로 만들어지기 때문에 공식을지도에 직접 작성하여 게임을 떠나지 않고도 여러 샘플링을 확인할 수 있습니다. 과학적으로는 아니지만 결과를 시각적으로 볼 수있는 좋은 방법입니다.
내 최선의 추측은 먼저 2 차원 공간에서 균일하게 분포 된 점 세트를 생성 한 다음 일종의 투영을 사용하여 구의 표면에 해당 점을 투영하는 것입니다.
점을 생성하는 방식과 점을 매핑하는 방식을 혼합하고 일치시켜야 할 것입니다. 2D 포인트 생성 측면에서, 스크램블링 된 낮은 불일치 시퀀스는 일반적으로 "뭉치지 않는"포인트를 생성하기 때문에 시작하기에 좋은 장소 (즉, 스크램블링 된 Sobol 시퀀스)가 될 것이라고 생각합니다. 사용할 매핑 유형에 대해 잘 모르겠지만 Woflram은 Gnonomic 투영법을 표시 했습니다.
MATLAB에는을 사용하여 생성 q = sobolset(2)
하고 스크램블 할 수있는 불일치 시퀀스가 적절하게 구현되어 있습니다 q = scramble(q)
. MATLAB에는 매핑과 그래픽을 직접 코딩하고 싶지 않은 경우 사용할 수있는 다양한 투영 함수가 포함 된 매핑 도구 상자도 있습니다.