3 차원 단위 구의 표면에 균일하게 분포 된 점을 생성하는 방법은 무엇입니까?


68

3 차원 단위 구의 표면에 균일하게 분포 된 점을 생성하는 방법이 궁금합니다. 또한 이러한 점을 생성 한 후 표면에서 실제로 균일한지 여부를 시각화하고 확인하는 가장 좋은 방법은 무엇 입니까?x2+y2+z2=1


유니폼으로 "정규"를 의미하는 경우 = 2, 4, 6, 8, 12, 20 이외의 방법은 없습니다 .n
Marcos

1
: 무엇 MultiVariateGaussian 그 벡터의 샘플 잘못 그냥 정상화 v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))다음과 v = v/v.norm(10000)
피노키오

답변:


72

표준 방법은 세 가지 표준 법선을 생성하고 이들로부터 단위 벡터를 구성하는 것입니다. 즉, 및 인 경우 는 균일합니다. 구체에 분배. 이 방법은 차원 구체 에도 잘 작동합니다 .λ (2) = X (2) (1) + X (2) (2) + X (2) (3) ( X 1 / λ , X 2 / λ , X 3 / λ ) DXiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

3D에서는 거부 샘플링을 사용할 수 있습니다. 의 길이 가 1보다 작거나 같을 때까지 균일 한 분포 에서 를 그립니다. 벡터를 단위 길이로 정규화합니다. 구면 포인트 당 예상 시행 횟수는 = 1.91입니다. 더 큰 차원에서 예상되는 시행 횟수는 너무 커져서이를 실현할 수 없게됩니다. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) (2) (3) / ( 4 π / 3 )Xi[1,1](X1,X2,X3)23/(4π/3)

균일 성을 확인하는 방법에는 여러 가지가 있습니다 . 계산적으로 다소 집중적이지만 깔끔한 방법은 Ripley의 K 함수를 사용하는 것 입니다. 구의 모든 위치 에서 (3D 유클리드) 거리 내 예상 포인트 수는 거리 내에있는 구의 면적에 비례하며 이는 와 같습니다 . 모든 인터 포인트 거리를 계산함으로써 데이터를이 이상과 비교할 수 있습니다.ρ π ρ 2ρρπρ2

통계 그래픽을 구성하는 일반적인 원칙은 비교를위한 좋은 방법은 대해 분산 안정화 잔차 를 그리는 것입니다 여기서 는 상호 거리 중 가장 작은 이며 입니다. 플롯은 0에 가까워 야합니다. (이 접근 방식은 기존과 다릅니다.)내가 = 1 , 2 , ... , N ( N - 1 ) / 2 = m의 D [ I ] I 번째 I = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ithei=2i/m

다음은 첫 번째 방법으로 얻은 균일 한 구면 분포에서 100 개의 독립적 인 그림을 보여줍니다.

100 개의 균일 한 구형 포인트

거리의 진단 플롯은 다음과 같습니다.

진단 플롯

y 스케일은이 값이 모두 0에 가깝다는 것을 나타냅니다.

다음은 실제로 어떤 크기 편차가 실제로 불균일성을 나타내는 중요한 지표가 될 수 있는지를 보여주기 위해 100 개의 플롯을 축적 한 것입니다.

시뮬레이션 된 값

(이 음모는 브라운 다리 와 같이 끔찍한 것처럼 보입니다 ... 여기에 흥미로운 이론적 발견이있을 수 있습니다.)

마지막으로, 100 개의 균일 한 랜덤 포인트와 상위 반구에만 균일하게 분포 된 41 개의 포인트에 대한 진단 플롯이 있습니다.

시뮬레이션 된 비 균일 값

균일 한 분포와 비교하여 평균 반점 거리가 한 반구 범위로 크게 감소한 것을 보여줍니다 . 그것은 그 자체로는 의미가 없지만, 여기서 유용한 정보는 어떤 것이 하나의 반구 규모에서 불균일하다는 것입니다. 실제로이 그림은 한 반구가 다른 반구와 다른 밀도를 가지고 있음을 쉽게 감지합니다. (가장 많은 카이 제곱 테스트 를 통해 가능한 많은 반구를 테스트 할 반구를 미리 알고 있다면 더 많은 카이 제곱 검정을 통해 더 많은 검정력을 사용할 수 있습니다.)


@ whuber : 아주 좋은! 게시물 주셔서 감사합니다! " 가 구체에 균일하게 분포되어 있습니다." 증거에 대한 참조를 어디에서 찾을 수 있습니까, 아니면 단순히 증명할 수 있습니까? (X1/λ,X2/λ,X3/λ)
Qiang Li

23
@Qiang, 증명의 본질은 다음과 같습니다. 여기서 은 항등 행렬을 나타냅니다 . 이어서 대한 모든 직교 행렬 , . 따라서 의 분포는 회전하에 변하지 않습니다. 하자 그와주의 어떤 직교에 대한 . 이후 회전에 불변, 그래서이다 , 그리고 이후는 거의 확실하게, 다음은 균일 영역에 배포해야합니다. XN(0,In)Inn×nQQXN(0,In)XY Q = Q X / ‖의 Q X 2 = Q X /X 2 Q X Y Y 2 =Y=X/X2YQ=QX/QX2=QX/X2QXYY2=1
추기경

3
@Mike No. 위도 의 균일 한 분포는 구에 균일 한 분포를 나타내지 않기 때문입니다. (구 표면의 대부분은 적도에서 멀리 떨어진 적도 근처의 위도에 있습니다. 대신 의 균일 한 분포가 필요합니다 .)COS ( φ )ϕcos(ϕ)
whuber

1
@Ahsan 직교 행렬은 구의 영역 보존 변환의 전이 그룹을 형성하기 때문에 형식의 구의 부분 집합에 대해 분포가 균일 하지만 전체 구입니다. X/||X||2
whuber

1
@Cesar "균일 분포"(구면).
whuber

19

약간 간단한 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 = 1x2+y2=1z2x2+y2+z2=1

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

와 가 각각 에 균일하게 분포되어 있는지 ( 분명히)의 Y [ - 1 , 1 ] Zxy[1,1]z

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

명백하게, 소정의 값 , 및 균일 반경의 원의 주위에 분산되어 이 자신의 비의 아크 탄젠트의 분포를 보면 시험 할 수있다. 그러나 는 와 와 같은 한계 분포를 갖기 때문에 모든 쌍에 대해 유사한 설명이 적용되며,이 역시 테스트 할 수 있습니다. x y zxy zxy1z2zxy

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

여전히 확실하지 않은 경우 다음 단계는 임의의 3D 회전 또는 주어진 솔리드 각도 내에 몇 개의 포인트가 떨어지는 지 살펴 보는 것이지만 더 복잡해지기 때문에 불필요하다고 생각합니다.


점 (x, y, z)을 생성하는 방법이 whuber의 방법과 본질적으로 동일한 지 궁금합니다.
Qiang Li

3
아니요 : whuber는 두 개의 난수를 사용하지만 두 개는 임의의 숫자를 사용합니다. 광산은 " ]에 적합한 밀도로 에 점을 생성 한 다음 치수를 낮추는 특수한 경우입니다 . 여기서는 공식적으로 2 구 이므로 것이 편리하다 . ( 1 z 2 ) n / 2 1 n = 2[1,1](1z2)n/21n=2
Henry

3
또는보다 일반적으로 등면 투영법을 사용하여지도에서 균일 한 점을 생성 한 다음 (평면 영역이 원통형 등 평면 투영법) 다시 투영합니다. (+1)
whuber

@ whuber : 그렇습니다. 주제 외에 관심이있는 사람이라면 누구나 여기에 대화식으로 선택된 세계지도 투영법 이 있으며 그 중 일부는 동일 영역입니다
Henry

2
이것은 컴퓨터 그래픽, Archimedes 'Hat-Box 정리에 기반한 표준 접근 방식과 거의 같습니다 : mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
Edward KMETT

10

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)에서 확인할 수 있습니다.

공의 표면 또는 내부에서 점이 실제로 균일한지 여부를 확인하려면 한계 값을 살펴보십시오 (회전 불변으로 인해 투영 된 샘플의 제곱 표준은 베타 분포 임).


: 무엇 MultiVariateGaussian 그 벡터의 샘플 잘못 그냥 정상화 v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))다음과 v = v/v.norm(10000)
피노키오

8

박사 과정에서 비슷한 문제 (n-sphere)가 있었고 지역 '전문가'중 하나가 n-cube에서 거부 샘플링을 제안했습니다! 물론 이것은 내가 hunderds의 순서로 n을 보면서 우주의 나이를 가져 갔을 것입니다.

내가 사용한 알고리즘은 매우 간단하며 다음과 같이 게시됩니다.

n-sphere에서 WP Petersen 및 A. Bernasconic Uniform 샘플링 : 등방성 분석법 기술 보고서, TR-97-06, 스위스 과학 컴퓨팅 센터

또한 내가 보지 않은 참고 문헌에이 논문이 있습니다. 유용 할 수 있습니다.

Harman, R. & Lacko, V. spheres 및 balls 에서 균일 한 샘플링을위한 분해 알고리즘에 관한 연구 다변량 분석 저널, 2010nnn


이 참고 문헌의 전체 텍스트를 찾을 수있는 링크를 게시 할 수 있습니까? 감사.
Qiang Li

나는 나에게 종이를 가지고 있지 않지만,이 페이지는 알고리즘 (및 다른 여러) mlahanas.de/Math/nsphere.htm
emakalic

3
내가 이해하는 것처럼 (Petersen과 Bernasconic의 논문에서) d (d) 공에 대해 U (0,1) 변량을 (1 / d) 거듭 제곱으로 높이고 마지막 각도를 U (0,2 ) 변수입니다. 중간 각도는 로 구할 수 있습니다 여기서 은 . 나에게 이것은 다소 간단하게 들린다. 내가 궁금해하는 것은 이것입니다 : 유니폼에 준 무작위 시퀀스를 사용하면 공에도 좋은 점이 있습니까? C . a s i n ( k πC - 1 C.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit

3

나는 전에이 문제를 겪었으며 여기에 내가 찾은 대안이 있습니다.

분포 자체에 관해서는, 내가 제대로 작동하는 공식은 극좌표를 사용하는 것입니다 (실제로 개발 된 극좌표의 변형을 사용함). 직교 좌표로 변환하십시오.

반경은 물론 당신이 플로팅하는 구의 반경입니다. 그런 다음 평평한 평면에서 각도에 대한 두 번째 값과 그 평면 위 또는 아래의 각도 인 세 번째 값이 있습니다.

적절한 분포를 얻으려면 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

의사 코드는 다음과 같습니다.

  1. vMultiVariateGaussian(μ,σI)
  2. v=vv

파이 토치에서 :

v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

나는 이것을 충분히 이해하지 못하지만 whuber는 다음과 같이 들었습니다.

v = torch.normal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

각 좌표에 대해 일 변량 법선으로부터 샘플링하는 것도 정확합니다.


0

내 최선의 추측은 먼저 2 차원 공간에서 균일하게 분포 된 점 세트를 생성 한 다음 일종의 투영을 사용하여 구의 표면에 해당 점을 투영하는 것입니다.

점을 생성하는 방식과 점을 매핑하는 방식을 혼합하고 일치시켜야 할 것입니다. 2D 포인트 생성 측면에서, 스크램블링 된 낮은 불일치 시퀀스는 일반적으로 "뭉치지 않는"포인트를 생성하기 때문에 시작하기에 좋은 장소 (즉, 스크램블링 된 Sobol 시퀀스)가 될 것이라고 생각합니다. 사용할 매핑 유형에 대해 잘 모르겠지만 Woflram은 Gnonomic 투영법을 표시 했습니다.

MATLAB에는을 사용하여 생성 q = sobolset(2)하고 스크램블 할 수있는 불일치 시퀀스가 ​​적절하게 구현되어 있습니다 q = scramble(q). MATLAB에는 매핑과 그래픽을 직접 코딩하고 싶지 않은 경우 사용할 수있는 다양한 투영 함수가 포함 된 매핑 도구 상자도 있습니다.


1
이러한 예측 중 어느 것도 무작위의 균일 성을 유지할 수 있습니까? 다시 말하지만,이 점들의 최종 분포가 구 표면에 실제로 균일하게 분포되어 있는지 어떻게 확인할 수 있습니까? 감사.
Qiang Li

죄송합니다. 가설을 말하면 ... MATLAB의 매핑 함수를 사용하면 시각화가 포함되어 있기 때문에 확인할 수 있습니다. 그렇지 않은 경우 무작위 각도 등을 사용하여 3D 구면에 균일하게 분포 된 점을 생성하는 방법에 대한 훌륭한 웹 사이트를 찾았습니다. C 코드가 있습니다. 살펴보기
Berk U.

3
지모 닉 투영의 균일 한 랜덤 포인트는 지모 닉이 동일한 면적이 아니기 때문에 구에서 균일하지 않습니다. Henry가 제안한 -> (위도에서 의 직사각형까지 ) 같은 지역입니다. ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.