Spørsmål:
Hvordan genererer jeg jevnt fordelte punkter på overflaten til 3-d-enhetskulen?
Qiang Li
2011-03-08 04:57:21 UTC
view on stackexchange narkive permalink

Jeg lurer på hvordan man kan generere jevnt fordelte punkter på overflaten til 3-d-enhetssfæren? Også etter å ha generert disse punktene, hva er den beste måten å visualisere og sjekke om de virkelig er ensartede på overflaten $ x ^ 2 + y ^ 2 + z ^ 2 = 1 $?

Hvis du med uniform mener du "vanlig", er det ingen måte å gjøre det utenfor $ n $ = 2, 4, 6, 8, 12, 20.
hva er galt med prøven fra en MultiVariateGaussian og den vektoren normaliserer den bare: `v = MultivariateNormal (torch.zeros (10000), torch.eye (10000))` og deretter `v = v / v.norm (10000)`
Syv svar:
whuber
2011-03-08 06:30:44 UTC
view on stackexchange narkive permalink

En standardmetode er å generere tre standardnormaler og konstruere en enhetsvektor fra dem. Det vil si når $ X_i \ sim N (0,1) $ og $ \ lambda ^ 2 = X_1 ^ 2 + X_2 ^ 2 + X_3 ^ 2 $, så $ (X_1 / \ lambda, X_2 / \ lambda, X_3 / \ lambda) $ fordeles jevnt på sfæren. Denne metoden fungerer også bra for $ d $ -dimensjonale kuler.

I 3D kan du bruke avvisningssampling: tegne $ X_i $ fra en jevn $ [- 1,1] $ fordeling til lengden på $ (X_1, X_2, X_3) $ er mindre enn eller lik 1, da - akkurat som med den foregående metoden - normaliserer vektoren til enhetslengde. Det forventede antall forsøk per sfærisk punkt tilsvarer $ 2 ^ 3 / (4 \ pi / 3) $ = 1,91. I høyere dimensjoner blir det forventede antall forsøk så stort at dette raskt blir umulig.

Det er mange måter å sjekke ensartethet på . En fin måte, selv om det er noe beregningsintensivt, er med Ripleys K-funksjon. Det forventede antall poeng innenfor (3D euklidisk) avstand $ \ rho $ fra et hvilket som helst sted på sfæren er proporsjonalt med området til sfæren innen avstand $ \ rho $, som tilsvarer $ \ pi \ rho ^ 2 $. Ved å beregne alle avstandspunkter kan du sammenligne dataene til dette idealet.

Generelle prinsipper for å konstruere statistisk grafikk antyder at en god måte å sammenligne er å plotte variansstabiliserte rester $ e_i (d _ {[i] } - e_i) $ mot $ i = 1, 2, \ ldots, n (n-1) / 2 = m $ hvor $ d _ {[i]} $ er $ i ^ \ teksten {th} $ minste av gjensidige avstander og $ e_i = 2 \ sqrt {i / m} $. Tomten skal være nær null. (Denne tilnærmingen er ukonvensjonell.)

Her er et bilde av 100 uavhengige tegninger fra en ensartet sfærisk fordeling oppnådd med den første metoden:

100 uniform spherical points

Her er det diagnostiske plottet over avstandene:

Diagnostic plot

Y-skalaen antyder at disse verdiene er nær null.

Her er akkumuleringen av 100 slike plott for å foreslå hvilke størrelsesavvik som faktisk kan være viktige indikatorer for manglende ensartethet:

Simulated values

(Disse plottene ser veldig mye ut som Brownian broer... det kan være noen interessante teoretiske funn som lurer her.)

Til slutt, her er det diagnostiske plottet for en sett med 100 enhetlige tilfeldige punkter pluss ytterligere 41 poeng som er jevnt fordelt på den øvre halvkule:

Simulated non-uniform values

I forhold til den jevne fordelingen viser det en betydelig reduksjon i gjennomsnittlig avstandspunkt til en halvkule. Det i seg selv er meningsløst, men den nyttige informasjonen her er at noe er ikke-ensartet på skalaen til en halvkule. I virkeligheten oppdager dette plottet lett at den ene halvkulen har en annen tetthet enn den andre. (En enklere chi-square test ville gjort dette med mer kraft hvis du på forhånd visste hvilken halvkule du skulle teste ut av de uendelig mange mulige.)

@whuber: veldig hyggelig! tusen takk for innlegget ditt! "$ (X_1 / \ lambda, X_2 / \ lambda, X_3 / \ lambda) $ er jevnt fordelt på sfæren." hvor kan jeg finne referanse om beviset, eller er det bare bevisbart?
@whuber hvilken programvare brukte du for å generere kuleplottet?
Jeg vedder på at det er mathematica ... bare fortell fra fargen ... :)
@Qiang, Her er essensen av beviset: La $ X \ sim \ mathcal {N} (0, I_n) $ hvor $ I_n $ betegner $ n \ times n $ identitetsmatrise. Deretter for * hvilken som helst * ortogonal matrise $ Q $, $ Q X \ sim N (0, I_n) $. Derfor er fordelingen av $ X $ uforanderlig under rotasjoner. La $ Y = X / \ | X \ | _2 $ og merk at $ Y_Q = Q X / \ | Q X \ | _2 = Q X / \ | X \ | _2 $ for en hvilken som helst ortogonal $ Q $. Siden $ X $ er uforanderlig for rotasjoner, er det også $ Y $, og siden $ \ | Y \ | _2 = 1 $ nesten sikkert, så må den fordeles jevnt på sfæren.
@whuber, (+1), fint svar.
@Berk * Mathematica * -koden er `With [{n = 100}, x = # / Norm [#] & / @ RandomReal [NormalDistribution [0, 1], {n, 3}]]; Graphics3D [{Opacity [0.75 ], Sfære [{0, 0, 0}, 1], opasitet [1], punktstørrelse [0,025], punkt / @ x}] `
Kunne du ikke nettopp ha brukt parameteriseringen $ [x, y, z] = [\ cos (\ theta) \ sin (\ phi), \ sin (\ theta) \ sin (\ phi), cos (\ phi) ] $, ​​med $ \ theta, \ phi \ sim U [0,2 \ pi] $?
@Mike Nei, fordi en jevn fordeling av breddegraden $ \ phi $ ikke gir en jevn fordeling på sfæren. (Det meste av kuleoverflaten ligger på lavere breddegrader nær ekvator bort fra polene. Du trenger en jevn fordeling av $ \ cos (\ phi) $ i stedet.)
@cardinal fin forklaring, bare en ting jeg er forvirret over hvordan kan du si fordi $ \ vec Y $ er rotasjon i variant så den er jevnt fordelt på n sfære.
@Ahsan Fordi de ortogonale matriser danner en transitiv gruppe av områdebevarende transformasjoner av sfæren, er fordelingen jevn over delmengden av sfæren av formen $ X / || X || _2 $: men dette er hele sfæren.
Hva ville være et vanlig navn for distribusjonen som disse 3D-punktene er samplet fra?
@Cesar "Uniform distribution" (på sfæren).
hva er galt med prøve fra en MultiVariateGaussian og den vektoren normaliserer det bare: `v = MultivariateNormal (torch.zeros (10000), torch.eye (10000))` og deretter `v = v / v.norm (10000)`
@Pinocchio Generelt vil det ikke fungere.Du trenger kovariansmatrisen for å være et mangfold av identiteten - og det er nettopp det løsningen min bruker.
Henry
2011-03-08 07:19:48 UTC
view on stackexchange narkive permalink

Her er noen ganske enkle R-koder

  n <- 100000 # stor nok til meningsfulle testerz <- 2 * runif (n) - 1 # uniform på [-1, 1] theta <- 2 * pi * runif (n) - pi # uniform på [-pi, pi] x <- sin (theta) * sqrt (1-z ^ 2) # basert på angley <- cos (theta) * sqrt ( 1-z ^ 2) 

Det er veldig enkelt å se fra konstruksjonen at $ x ^ 2 + y ^ 2 = 1- z ^ 2 $ og så $ x ^ 2 + y ^ 2 + z ^ 2 = 1 $, men hvis den må testes, bør

  bety (x ^ 2 + y ^ 2 + z ^ 2) # være 1var (x ^ 2 + y ^ 2 + z ^ 2) # skal være 0  

og lett å teste at hver av $ x $ og $ y $ er jevnt fordelt på $ [- 1,1] $ ( $ z $ er åpenbart) med

  plot.ecdf (x) # skal være ensartet på [-1, 1] plot.ecdf (y) plot.ecdf (z)  

Det er tydelig at en verdi på $ z $, $ x $ og $ y $ er jevnt fordelt rundt en sirkel med radius $ \ sqrt {1-z ^ 2} $, og dette kan testes ved å se ved fordelingen av arktangenten til deres forhold. Men siden $ z $ har samme marginale fordeling som $ x $ og som $ y $, gjelder en lignende påstand for ethvert par, og dette kan også testes.

  plot.ecdf (atan2 (x, y)) # skal være ensartet på [-pi, pi] plot.ecdf (atan2 (y, z)) plot.ecdf (atan2 (z , x))  

Hvis du fremdeles ikke er overbevist, vil de neste trinnene være å se på en vilkårlig 3D-rotasjon eller hvor mange punkter som faller innenfor en gitt solid vinkel, men det begynner å bli mer komplisert, og jeg synes er unødvendig.

Jeg lurer bare på om metoden din for å generere poeng (x, y, z) egentlig er den samme som whubers metode?
Nei det er det ikke: whuber bruker tre tilfeldige tall mens jeg bruker to. Gruve er et spesielt tilfelle av "generer et poeng på $ [- 1,1] $ med passende tetthet [proporsjonal med $ (1-z ^ 2) ^ {n / 2-1} $] og trapp deretter ned en dimensjon" . Her er $ n = 2 $ praktisk, da dette formelt sett er en [2-sfære] (http://en.wikipedia.org/wiki/2-sphere).
Eller, mer generelt, generer ensartede punkter på kartet ved hjelp av en hvilken som helst projeksjon med samme areal (din er en sylindrisk en med samme areal), og projiser deretter tilbake. (+1)
@whuber: Faktisk. Offtopic, men for alle interesserte har jeg et interaktivt utvalg av verdenskartprojeksjoner [her] (http://www.btinternet.com/~se16/js/mapproj.htm), hvorav noen er like store
Dette er ganske mye standardtilnærmingen som brukes i datagrafikk, basert på Archimedes 'Hat-Box Theorem: http://mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
@Henry, så for 3-sfæren kan vi generere en tilfeldig variabel med tetthet $ \ sqrt {1-x ^ 2} $, en uavhengig uniform $ [- 1,1] $ og en uavhengig vinkel?Hva heter denne teoremet?Og hvordan prøver vi fra disse distribusjonene?
@ThomasAhle - to (ikke tre) tilfeldige tall: en jevn tilfeldig variabel på $ [- 1,1] $ og en uavhengig vinkel.Tettheten for førstnevnte er proporsjonal med $ (1-z ^ 2) ^ {2 / 2-1} = 1 $
@Henry, som er for 2-sfæren (som du nevner) Jeg er interessert i høyere dimensjoner.Har du et navn / referanse til metoden din?
@ThomasAhle Jeg har ikke noe navn på det.Det er på en måte "åpenbart" så jeg fant det uavhengig, men det er ikke så enkelt å implementere for høyere dimensjoner som generalisering av whubers metode
V Lacko
2011-11-10 14:06:40 UTC
view on stackexchange narkive permalink

Hvis du vil prøve punkter jevnt fordelt på 3D-sfæren (dvs. overflaten til en 3D-kule), bruk en enkel avvisning eller metoden til Marsaglia (Ann. Math. Statist., 43 (1972), s. . 645–646). For lave dimensjoner er avvisningsforholdet ganske lavt.

Hvis du vil generere tilfeldige punkter fra høyere dimensjonale kuler og kuler, avhenger det av formålet og skalaen til simuleringen. Hvis du ikke vil utføre store simuleringer, kan du bruke metoden til Muller (Commun. ACM, 2 (1959), s. 19–20) eller dens "ball" -versjon (se papiret fra Harman & Lacko sitert ovenfor). Det vil si:

for å få en prøve jevnt fordelt på en n-sfære (overflate) 1) generere X fra n-dimensjonal standard normalfordeling2) dele hver komponent av X med den euklidiske normen X

for å få en prøve jevnt fordelt på en n-kule (indre) 1) generere X fra (n + 2) -dimensjonal standard normalfordeling2) dele hver komponent av X med den euklidiske normen X og ta bare første n komponenter

Hvis du vil utføre store simuleringer, bør du undersøke mer spesialiserte metoder. På forespørsel kan jeg sende deg papiret fra Harman og Lacko om betingede distribusjonsmetoder, som gir klassifisering og generaliseringer av noen algoritmer som er nevnt i denne diskusjonen. Kontakten er tilgjengelig på nettstedet mitt (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Hvis du vil sjekke om dine poeng virkelig er ensartede på overflaten eller interiøret av en ball, se på marginalene (alle skal være likt, på grunn av rotasjonsinvariansen er den kvadratiske normen til et projisert utvalg beta-distribuert).

hva er galt med prøve fra en MultiVariateGaussian og den vektoren normaliserer det bare: `v = MultivariateNormal (torch.zeros (10000), torch.eye (10000))` og deretter `v = v / v.norm (10000)`
emakalic
2011-03-08 06:22:37 UTC
view on stackexchange narkive permalink

Jeg hadde et lignende problem (n-sfære) i løpet av doktorgraden, og en av de lokale ekspertene foreslo prøvetaking fra en n-kube! Dette ville selvfølgelig tatt alderen til universet da jeg så på n i rekkefølgen av hunderds.

Algoritmen jeg endte med å bruke er veldig enkel og publisert i:

WP Petersen og A. Bernasconic Uniform prøvetaking fra en n-sfære: Isotropisk metode Teknisk rapport, TR-97-06, Swiss Center for Scientific Computing

Jeg har også denne artikkelen i bibliografien som jeg ikke har sett på. Du kan finne det nyttig.

Harman, R. & Lacko, V. Om dekomponeringsalgoritmer for enhetlig sampling fra $ n $ -sfærer og $ n $ -baller Journal of Multivariate Analysis, 2010

er det mulig å legge ut lenkene der jeg kan finne hele teksten til disse referansene? Takk.
Jeg har ikke papiret på meg, men denne siden ser ut til å beskrive algoritmen (og flere andre) http://www.mlahanas.de/Math/nsphere.htm
Som jeg forstår (fra Petersen og Bernasconic) for en d-dimensjonal kule, kan man generere radiusen ved å heve en U (0,1) variabel til (1 / d) kraften, og den siste vinkelen som en U (0,2 $ \ pi $) varierer. Mellomvinklene kan fås som $ C. asin (\ sqrt [k] {u}) $, hvor $ {C ^ {- 1}} $ er $$ \ frac {\ sqrt {\ pi} \ Gamma (\ frac {k} {2} + 0,5) } {\ Gamma (\ frac {k} {2} + 1)} $$. For meg høres dette ganske enkelt ut. Det jeg lurer på er dette: Hvis jeg bruker en kvasi tilfeldig sekvens for uniformene mine, vil jeg også få finhet i ballen?
TheDerpyAlicorn
2016-08-29 13:53:54 UTC
view on stackexchange narkive permalink

Jeg har hatt dette problemet før, og her er et alternativ jeg fant,

Når det gjelder selve fordelingen, er formelen jeg fant som fungerer anstendig å bruke polare koordinater (jeg bruker faktisk en variant av polarkoordinater som utviklet seg), konverter deretter til kartesiske koordinater.

Radien er selvfølgelig radiusen til sfæren du planlegger på. Da har du den andre verdien for vinkel på det flate planet, etterfulgt av den tredje verdien som er vinkelen over eller under dette planet.

For å få en anstendig fordeling, anta at U er et jevnt fordelt tilfeldig tall, r er radius, a er den andre polare koordinaten, og b er den tredje polare koordinaten,

a = U * 360b = U + U-1, konverter deretter til kartesisk viax = r * sin (b) sin (a) z = r sin ( b) cos (a) y = r sin (b)

Jeg fant nylig følgende som er bedre matematisk sett, a = 2 (pi) * Ub = cos ^ - 1 (2U-1)

Egentlig ikke mye forskjellig fra min opprinnelige formel, selv om min er grader mot radianer.

Denne siste versen angivelig kan ion brukes til hypersfærer, selv om det ikke ble nevnt hvordan jeg skulle oppnå det. . Faktisk, fordi kartene er laget med lua-skript, kan du bygge formelen rett inn på kartet og dermed sjekke flere samplinger uten å forlate spillet. Ikke vitenskapelig, men er en god metode for å se resultatene visuelt.

Pinocchio
2018-04-01 06:22:18 UTC
view on stackexchange narkive permalink

Her er pseudokoden:

  1. $ v \ sim MultiVariateGaussian (\ mu, \ sigma I) $
  2. $ v = \ frac {v} {\ |v \ |} $

I pytorch:

  v = MultivariateNormal (fakkelnuller (10000), fakkel øye (10000))
v = v / v.norm (2)
 

Jeg forstår ikke dette godt nok, men jeg har blitt fortalt av whuber at:

  v = fakkel. normal (fakkel. nuller (10000), fakkel. øye (10000))
v = v / v.norm (2)
 

er også riktig, dvs. prøvetaking fra en univariat normal for hver koordinat.

Berk U.
2011-03-08 05:32:00 UTC
view on stackexchange narkive permalink

Min beste gjetning er å først generere et sett med jevnt fordelte punkter i et 2-dimensjonalt rom og deretter projisere disse punktene på overflaten av en sfære ved hjelp av en slags projeksjon.

Du må sannsynligvis blande og matche måten du genererer poengene på, slik du kartlegger dem. Når det gjelder generasjonen av 2D-punktgenerering, tror jeg at krypterte sekvenser med lav avvik ville være et godt sted å starte (dvs. en kryptert Sobol-sekvens) siden det vanligvis produserer punkter som ikke er "klumpet sammen". Jeg er ikke like sikker på hvilken type kartlegging jeg skal bruke, men Woflram poppet opp den gnonomiske projeksjonen... så kanskje det kunne fungere?

MATLAB har en anstendig implementering av sekvenser med lav avvik som du kan generere ved hjelp av q = sobolset (2) og scramble ved hjelp av q = scramble (q) . Det er også en kartleggingsverktøykasse i MATLAB med en rekke forskjellige projiseringsfunksjoner du kan bruke i tilfelle du ikke ønsker å kode kartleggingen og grafikken selv.

kan noen av disse fremskrivningene fortsatt bevare enhetligheten i tilfeldighet? Igjen, hvordan kan jeg sjekke om den endelige fordelingen av disse punktene virkelig er jevnt fordelt på kuleoverflaten? Takk.
Beklager at jeg bare snakket hypotetisk ... Jeg tror at kartleggingsfunksjonene på MATLAB vil tillate deg å sjekke det siden de har noen visualiseringer innebygd i dem. Hvis ikke, fant jeg også en fin nettside som snakker om hvordan man genererer jevnt fordelte punkter på en sfære i 3D ved å bruke ting som randomiserte vinkler osv. De har også noen C-koder der. [Ta en titt] (http://paulbourke.net/geometry/spherepoints/)
Ensartede tilfeldige punkter på en gnomonic projeksjon vil ikke være ensartede på sfæren, fordi gnomonic ikke er like areal. Projeksjonen foreslått av Henry, $ (\ lambda, \ phi) $ -> $ (\ lambda, \ sin (\ phi)) $ (fra lengdegrad til et rektangel i $ \ mathbb {R} ^ 2 $) , * er * like areal.


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 2.0-lisensen den distribueres under.
Loading...