Zastanawiam się, jak wygenerować równomiernie rozmieszczone punkty na powierzchni sfery jednostki 3-d? Również po wygenerowaniu tych punktów, jaki jest najlepszy sposób na wizualizację i sprawdzenie, czy są one naprawdę jednolite na powierzchni ?
random-generation
Qiang Li
źródło
źródło
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
a następniev = v/v.norm(10000)
Odpowiedzi:
Standardową metodą jest wygenerowanie trzech standardowych norm i zbudowanie z nich wektora jednostkowego. To znaczy, gdy i λ 2 = X 2 1 + X 2 2 + X 2 3 , wówczas ( X 1 / λ , X 2 / λ , X 3 / λ ) jest równomiernie rozłożone na kula. Ta metoda działa również dobrze w przypadku sfer wymiarowych d .Xi∼N(0,1) λ2=X21+X22+X23 (X1/λ,X2/λ,X3/λ) d
W 3D możesz użyć próbkowania odrzucenia: narysuj z równomiernego rozkładu [ - 1 , 1 ], aż długość ( X 1 , X 2 , X 3 ) będzie mniejsza lub równa 1, a następnie - podobnie jak w przypadku poprzednia metoda - znormalizuj wektor do długości jednostkowej. Oczekiwana liczba prób na punkt kulisty wynosi 2 3 / ( 4 π / 3 ) = 1,91. W wyższych wymiarach oczekiwana liczba prób staje się tak duża, że szybko staje się to niewykonalne.Xi [−1,1] (X1,X2,X3) 23/(4π/3)
Istnieje wiele sposobów sprawdzenia jednolitości . Zgrabnym, choć nieco wymagającym obliczeniowo, jest funkcja K Ripleya . Oczekiwana liczba punktów w (3D euklidesowej) odległości dowolnego miejsca na kuli jest proporcjonalna do powierzchni kuli w odległości ρ , która jest równa π ρ 2 . Obliczając wszystkie odległości między punktami, możesz porównać dane z tym ideałem.ρ ρ πρ2
Ogólne zasady konstruowania grafiki statystycznej sugerują, że dobrym sposobem na porównanie jest wykreślenie reszt stabilizowanych wariancją względem i = 1 , 2 , … , n ( n - 1 ) / 2 = m gdzie d [ i ] jest i th najmniejsza wzajemnych odległościach i e i = 2 √ei(d[i]−ei) i=1,2,…,n(n−1)/2=m d[i] ith . Fabuła powinna być bliska zeru. (To podejście jest niekonwencjonalne).ei=2i/m−−−√
Oto obraz 100 niezależnych losowań z jednolitego rozkładu sferycznego uzyskanych pierwszą metodą:
Oto wykres diagnostyczny odległości:
Skala y sugeruje, że wszystkie te wartości są bliskie zeru.
Oto suma 100 takich wykresów, aby zasugerować, jakie odchylenia wielkości mogą być znaczącymi wskaźnikami niejednorodności:
(Te fabuły wyglądają okropnie jak mosty Browna ... mogą tu się kryć ciekawe odkrycia teoretyczne.)
Na koniec, oto wykres diagnostyczny dla zestawu 100 jednolitych losowych punktów plus kolejne 41 punktów równomiernie rozmieszczonych tylko na górnej półkuli:
W stosunku do rozkładu równomiernego pokazuje znaczny spadek średnich odległości między punktami w zakresie jednej półkuli. To samo w sobie nie ma znaczenia, ale użyteczną informacją jest to, że coś jest nierównomierne w skali jednej półkuli. W efekcie ten wykres łatwo wykrywa, że jedna półkula ma inną gęstość niż druga. (Prostszy test chi-kwadrat zrobiłby to z większą mocą , gdybyś z góry wiedział, którą półkulę przetestować spośród nieskończenie wielu możliwych).
źródło
Oto trochę raczej prosty kod R.
Z konstrukcji bardzo łatwo jest zauważyć, że a więc ale jeśli trzeba to przetestować, tox2+y2=1−z2 x2+y2+z2=1
i łatwe do sprawdzenia, że każdy z i są równomiernie rozmieszczone na ( pewnością jest), zx y [−1,1] z
Oczywiście, biorąc pod uwagę wartość , i są równomiernie rozmieszczone wokół okręgu o promieniu i można to sprawdzić, patrząc na rozkład arcus tangensu ich stosunku. Ale ponieważ ma taki sam rozkład krańcowy jak i jak , podobne stwierdzenie jest prawdziwe dla każdej pary i to również można przetestować.z x y 1−z2−−−−−√ z x y
Jeśli nadal nie będzie przekonany, następnym krokiem byłoby przyjrzenie się dowolnemu obrotowi trójwymiarowemu lub liczbie punktów mieszczących się w danym kącie bryłowym, ale zaczyna się to komplikować i myślę, że nie jest to konieczne.
źródło
Jeśli chcesz próbkować punkty równomiernie rozmieszczone na kuli 3D (tj. Powierzchni kuli 3D), użyj prostego odrzucenia lub metody Marsaglii (Ann. Math. Statist., 43 (1972), s. 645– 646). W przypadku niskich wymiarów współczynnik odrzucenia jest dość niski.
Jeśli chcesz generować losowe punkty ze sfer i kulek o wyższych wymiarach, zależy to od celu i skali symulacji. Jeśli nie chcesz wykonywać dużych symulacji, skorzystaj z metody Mullera (Commun. ACM, 2 (1959), s. 19–20) lub jej wersji „kulowej” (patrz artykuł Harman & Lacko cytowany powyżej). To jest:
aby uzyskać próbkę równomiernie rozłożoną na kuli n (powierzchni) 1) wygeneruj X z n-wymiarowego standardowego rozkładu normalnego 2) podziel każdy składnik X przez euklidesową normę X
aby uzyskać próbkę równomiernie rozłożoną na kuli n (wewnętrznej) 1) wygeneruj X z (n + 2) wymiarowego standardowego rozkładu normalnego 2) podziel każdy składnik X przez euklidesową normę X i weź tylko pierwsze n składników
Jeśli chcesz wykonywać duże symulacje, powinieneś zbadać bardziej wyspecjalizowane metody. Na życzenie mogę wysłać artykuł Harmana i Lacko na temat metod dystrybucji warunkowej, który zapewnia klasyfikację i uogólnienie niektórych algorytmów wspomnianych w tej dyskusji. Kontakt jest dostępny na mojej stronie internetowej (http://www.iam.fmph.uniba.sk/ospm/Lacko)
Jeśli chcesz sprawdzić, czy twoje punkty są naprawdę jednolite na powierzchni lub we wnętrzu kuli, spójrz na marginesy (wszystkie powinny być takie same, ze względu na niezmienność rotacyjną, kwadratowa norma rzutowanej próbki jest rozkładana w wersji beta).
źródło
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
a następniev = v/v.norm(10000)
Miałem podobny problem (sferę n) podczas mojego doktoratu i jeden z lokalnych „ekspertów” zasugerował odrzucenie próbkowania z n-sześcianu! To oczywiście zajęłoby wiek wszechświata, gdy patrzyłem na n w kolejności hunderdów.
Algorytm, którego użyłem, jest bardzo prosty i opublikowany w:
WP Petersen i A. Bernasconic Jednolite pobieranie próbek z kuli n: Metoda izotropowa Raport techniczny, TR-97-06, Szwajcarskie Centrum Informatyki Naukowej
Mam również ten artykuł w swojej bibliografii, na który nie spojrzałem. Może ci się przydać.
Harman, R. & Lacko, V. Na decompositional algorytmów jednolitego próbkowania od -spheres i -balls Journal of analizie wieloczynnikowej, 2010n n
źródło
Miałem już ten problem, a oto alternatywa, którą znalazłem,
Jeśli chodzi o sam rozkład, stwierdziłem, że wzór, który działa przyzwoicie, polega na użyciu współrzędnych biegunowych (faktycznie używam opracowanej odmiany współrzędnych biegunowych), a następnie przekształceniu na współrzędne kartezjańskie.
Promień jest oczywiście promieniem kuli, na której drukujesz. Następnie masz drugą wartość kąta na płaszczyźnie płaskiej, a następnie trzecią wartość, która jest kątem powyżej lub poniżej tej płaszczyzny.
Aby uzyskać przyzwoity rozkład, załóżmy, że U jest równomiernie rozmieszczoną liczbą losową, r jest promieniem, a jest drugą współrzędną biegunową, a b jest trzecią współrzędną biegunową,
a = U * 360 b = U + U-1, a następnie konwersja na kartezjański za pomocą x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)
Niedawno znalazłem następujący, który jest lepszy matematycznie: a = 2 (pi) * U b = cos ^ -1 (2U-1)
Właściwie niewiele różni się od mojej pierwotnej formuły, chociaż moje są stopniami vs radianami.
Ta najnowsza wersja podobno może być używana do hiperfer, choć nie wspomniano, jak to osiągnąć.
Chociaż wizualnie sprawdzam jednolitość za pomocą dość taniej metody tworzenia map dla Homeworld 2, a następnie „odtwarzania” tych map. W rzeczywistości, ponieważ mapy są tworzone za pomocą skryptów lua, możesz wbudować formułę bezpośrednio w mapę, a tym samym sprawdzić wiele próbek bez wychodzenia z gry. Być może nie naukowy, ale to dobra metoda wizualnego oglądania wyników.
źródło
Oto pseudokod:
W pytorch:
Nie rozumiem tego wystarczająco dobrze, ale whuber powiedział mi, że:
jest również poprawny, tj. próbkowanie z jednowymiarowej normalnej dla każdej współrzędnej.
źródło
Moim najlepszym pomysłem byłoby najpierw wygenerowanie zestawu równomiernie rozmieszczonych punktów w dwuwymiarowej przestrzeni, a następnie rzutowanie tych punktów na powierzchnię kuli za pomocą pewnego rodzaju projekcji.
Prawdopodobnie będziesz musiał mieszać i dopasowywać sposób generowania punktów do sposobu ich mapowania. Jeśli chodzi o generowanie punktów 2D, myślę, że zaszyfrowane sekwencje o niskiej rozbieżności byłyby dobrym miejscem do rozpoczęcia (tj. Zaszyfrowana sekwencja Sobola), ponieważ zwykle wytwarza punkty, które nie są „zlepione”. Nie jestem pewien, jakiego rodzaju mapowania użyć, ale Woflram wyskoczył z projekcji Gnonomic ... więc może to może zadziałać?
MATLAB ma przyzwoitą implementację sekwencji o niskiej rozbieżności, które można generować za pomocą
q = sobolset(2)
i szyfrować za pomocąq = scramble(q)
. W MATLAB-ie znajduje się także zestaw narzędzi do mapowania z szeregiem różnych funkcji projekcji, których możesz użyć, gdybyś nie chciał sam kodować mapowania i grafiki.źródło