Come generare punti distribuiti uniformemente sulla superficie della sfera dell'unità 3-d?


68

Mi chiedo come generare punti distribuiti uniformemente sulla superficie della sfera dell'unità 3D? Inoltre, dopo aver generato quei punti, qual è il modo migliore per visualizzare e verificare se sono veramente uniformi sulla superficie ?x2+y2+z2=1


Se per uniforme intendi "regolare", non c'è modo di farlo al di fuori di = 2, 4, 6, 8, 12, 20.n
Marcos

1
cosa c'è che non va nel campione di un MultiVariateGaussian e quel vettore lo normalizza: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))e poi v = v/v.norm(10000)
Pinocchio

Risposte:


72

Un metodo standard è generare tre normali standard e costruirne un vettore unitario. Cioè, quando e , quindi è uniformemente distribuito sulla sfera. Questo metodo funziona bene anche per le sfere dimensionali.λ 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

In 3D puoi usare il campionamento del rifiuto: disegna da una distribuzione uniforme fino a quando la lunghezza di è inferiore o uguale a 1, quindi - proprio come con il metodo precedente-- normalizzare il vettore alla lunghezza unitaria. Il numero previsto di prove per punto sferico è pari a = 1.91. In dimensioni più elevate il numero previsto di prove diventa così grande che diventa rapidamente impraticabile. [ - 1 , 1 ] ( X 1 , X 2 , X 3 ) 2 3 / ( 4 π / 3 )Xi[1,1](X1,X2,X3)23/(4π/3)

Esistono molti modi per verificare l'uniformità . Un modo pulito, anche se un po 'intenso dal punto di vista computazionale, è con la funzione K di Ripley . Il numero previsto di punti all'interno (3D euclidea) distanza di qualsiasi posizione sulla sfera è proporzionale all'area della sfera raggiungibile a , che è uguale a . Calcolando tutte le distanze tra punti è possibile confrontare i dati con questo ideale.ρ π ρ 2ρρπρ2

I principi generali della costruzione di grafici statistici suggeriscono che un buon modo per fare il confronto è quello di tracciare i residui stabilizzati alla varianza contro dove è l' più piccola delle distanze reciproche ed . La trama dovrebbe essere vicina allo zero. (Questo approccio non è convenzionale.)i = 1 , 2 , , n ( n - 1 ) / 2 = m d [ i ] i th e i = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ithei=2i/m

Ecco una foto di 100 disegni indipendenti da una distribuzione sferica uniforme ottenuta con il primo metodo:

100 punti sferici uniformi

Ecco il diagramma diagnostico delle distanze:

Grafico diagnostico

La scala y suggerisce che questi valori sono vicini a zero.

Ecco l'accumulo di 100 di questi grafici per suggerire quali deviazioni dimensionali potrebbero effettivamente essere indicatori significativi di non uniformità:

Valori simulati

(Queste trame assomigliano moltissimo ai ponti browniani ... potrebbero esserci interessanti scoperte teoriche in agguato qui.)

Infine, ecco il diagramma diagnostico per un insieme di 100 punti casuali uniformi più altri 41 punti distribuiti uniformemente solo nell'emisfero superiore:

Valori non uniformi simulati

Rispetto alla distribuzione uniforme, mostra una significativa riduzione delle distanze intermedie intermedie fino a un intervallo di un emisfero. Questo di per sé non ha senso, ma le informazioni utili qui sono che qualcosa non è uniforme sulla scala di un emisfero. In effetti, questo diagramma rileva prontamente che un emisfero ha una densità diversa rispetto all'altro. (Un test chi-quadro più semplice farebbe questo con più potenza se sapessi in anticipo quale emisfero testare da infinitamente molti possibili.)


@whuber: molto bello! grazie mille per il tuo post! " è distribuito uniformemente sulla sfera." dove posso trovare riferimenti sulla sua prova o è semplicemente provabile? (X1/λ,X2/λ,X3/λ)
Qiang Li

23
@Qiang, ecco l'essenza della dimostrazione: lascia dove indica la matrice di identità . Quindi per qualsiasi matrice ortogonale , . Quindi la distribuzione di è invariante sotto rotazioni. Sia e si noti che per qualsiasi ortogonale . Poiché è invariante alle rotazioni, lo è anche , e poiché quasi sicuramente, allora deve essere distribuito uniformemente sulla sfera. XN(0,In)Inn×nQQXN(0,In)XY Q = Q X /Q X 2 = Q X /X 2 Q X Y Y 2 = 1Y=X/X2YQ=QX/QX2=QX/X2QXYY2=1
cardinale

3
@ Mike No, perché una distribuzione uniforme della latitudine non fornisce una distribuzione uniforme sulla sfera. (La maggior parte della superficie della sfera si trova a latitudini più basse vicino all'equatore lontano dai poli. È invece necessaria una distribuzione uniforme di .)cos ( ϕ )ϕcos(ϕ)
whuber

1
@Ahsan Poiché le matrici ortogonali formano un gruppo transitivo di trasformazioni della sfera che preservano l'area, la distribuzione è uniforme sul sottoinsieme della sfera della forma : ma questa è l'intera sfera. X/||X||2
whuber

1
@Cesar "Distribuzione uniforme" (sulla sfera).
whuber

19

Ecco un codice R piuttosto semplice

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)     

È molto semplice vedere dalla costruzione che e così ma se deve essere testato allorax 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

e facile da testare che ciascuno di ed sono distribuiti uniformemente su ( è ovviamente) cony [ - 1 , 1 ] zxy[1,1]z

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

Chiaramente, dato un valore di , ed sono distribuiti uniformemente su un cerchio di raggio e questo può essere testato osservando la distribuzione del arcotangente del loro rapporto. Ma poiché ha la stessa distribuzione marginale di di , un'affermazione simile è vera per qualsiasi coppia, e anche questo può essere testato. 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))

Se non ancora convinto, i prossimi passi sarebbero guardare ad una rotazione 3-D arbitraria o quanti punti cadessero all'interno di un dato angolo solido, ma questo inizia a diventare più complicato, e penso che non sia necessario.


Mi chiedo solo se il tuo metodo per generare punti (x, y, z) è essenzialmente lo stesso del metodo di whuber?
Qiang Li

3
No non lo è: whuber usa tre numeri casuali mentre io ne uso due. Il mio è un caso speciale di "genera un punto su con densità adeguata [proporzionale a ] e poi abbassa una dimensione". Qui convenientemente quanto questa è formalmente una 2 sfera . ( 1 - z 2 ) n / 2 - 1 n = 2[1,1](1z2)n/21n=2
Henry,

3
Oppure, più in generale, genera punti uniformi sulla mappa usando qualsiasi proiezione di uguale area (la tua è cilindrica di uguale area), quindi proietta indietro. (+1)
whuber

@whuber: Davvero. Offtopic, ma per chiunque sia interessato ho una selezione interattiva di proiezioni di mappe del mondo qui , alcune delle quali sono uguali area
Henry

2
Questo è praticamente l'approccio standard utilizzato nella computer grafica, basato sul teorema di Hat-Box di Archimede: mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
Edward KMETT

10

Se vuoi campionare punti distribuiti uniformemente sulla sfera 3D (cioè la superficie di una palla 3D), usa un semplice rifiuto o il metodo di Marsaglia (Ann. Math. Statist., 43 (1972), pp. 645– 646). Per dimensioni ridotte, il rapporto di rifiuto è piuttosto basso.

Se si desidera generare punti casuali da sfere e sfere di dimensioni superiori, dipende dallo scopo e dalla scala della simulazione. Se non si desidera eseguire simulazioni di grandi dimensioni, utilizzare il metodo di Muller (Commun. ACM, 2 (1959), pagg. 19–20) o la sua versione "a palla" (vedere il documento di Harman & Lacko citato sopra). Questo è:

per ottenere un campione uniformemente distribuito su una n-sfera (superficie) 1) generare X dalla distribuzione normale standard n-dimensionale 2) dividere ogni componente di X per la norma euclidea di X

per ottenere un campione uniformemente distribuito su una n-ball (interno) 1) generare X da (n + 2) distribuzione normale standard tridimensionale 2) dividere ogni componente di X per la norma euclidea di X e prendere solo i primi n componenti

Se si desidera eseguire simulazioni di grandi dimensioni, è necessario studiare metodi più specializzati. Su richiesta, posso inviarti l'articolo di Harman e Lacko sui metodi di distribuzione condizionale, che fornisce la classificazione e le generalizzazioni di alcuni algoritmi menzionati in questa discussione. Il contatto è disponibile sul mio sito Web (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Se vuoi verificare se i tuoi punti sono veramente uniformi sulla superficie o sull'interno di una palla, guarda i marginali (tutti dovrebbero ugualmente, a causa dell'invarianza rotazionale, la norma quadrata di un campione proiettato è distribuita beta).


cosa c'è che non va nel campione di un MultiVariateGaussian e quel vettore lo normalizza: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))e poi v = v/v.norm(10000)
Pinocchio

8

Ho avuto un problema simile (n-sphere) durante il mio dottorato di ricerca e uno degli "esperti" locali ha suggerito il campionamento del rifiuto da un n-cube! Questo, ovviamente, avrebbe preso l'età dell'universo mentre stavo guardando n nell'ordine di hunderds.

L'algoritmo che ho finito per usare è molto semplice e pubblicato in:

WP Petersen e A. Bernasconic Uniform campionamento da una n-sfera: metodo isotropico Rapporto tecnico, TR-97-06, Centro svizzero di calcolo scientifico

Ho anche questo documento nella mia bibliografia che non ho mai visto. Potresti trovarlo utile.

Harman, R. & Lacko, V. Sugli algoritmi di decomposizione per campionamenti uniformi da -spheres e -balls Journal of Multivariate Analysis, 2010nnn


è possibile pubblicare i link dove posso trovare il testo completo di questi riferimenti? Grazie.
Qiang Li

Non ho il foglio addosso, ma questa pagina sembra descrivere l'algoritmo (e molti altri) mlahanas.de/Math/nsphere.htm
emakalic

3
A quanto ho capito, (dalla carta di Petersen e Bernasconic) per una palla d-dimensionale, si può generare il raggio alzando una U (0,1) variabile alla potenza (1 / d) e l'ultimo angolo come un U (0,2 ) variabile. Gli angoli intermedi possono essere ottenuti come , dove è . Per me questo sembra piuttosto semplice. Quello che mi chiedo è questo: se uso una sequenza quasi casuale per le mie uniformi, otterrò anche la gentilezza nella palla? C . a s i n ( k πC - 1 C.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit,

3

Ho avuto questo problema prima, ed ecco un'alternativa che ho trovato,

Per quanto riguarda la distribuzione stessa, la formula che ho scoperto che funziona in modo decente è quella di utilizzare le coordinate polari (in realtà utilizzo una variazione delle coordinate poler sviluppate), quindi la conversione in coordinate cartesiane.

Il raggio è ovviamente il raggio della sfera su cui si sta disegnando. Quindi hai il secondo valore per l'angolo sul piano piatto, seguito dal terzo valore che è l'angolo sopra o sotto quel piano.

Per ottenere una distribuzione decente, supponi che U sia un numero casuale distribuito uniformemente, r sia raggio, a sia la seconda coordinata polare e b sia la terza coordinata polare,

a = U * 360 b = U + U-1 quindi converti in cartesiano tramite x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

Recentemente ho trovato quanto segue matematicamente parlando, a = 2 (pi) * U b = cos ^ -1 (2U-1)

In realtà non è molto diverso dalla mia formula originale, anche se la mia è gradi vs radianti.

Questa versione recente si suppone possa essere usata per gli ipersferi, anche se non è stato fatto alcun riferimento su come raggiungerlo.

Anche se controllo l'uniformità visivamente con il metodo piuttosto economico di creare mappe per Homeworld 2 e poi "giocare" quelle mappe. Infatti, poiché le mappe sono realizzate con script lua, puoi creare la tua formula direttamente nella mappa e quindi controllare più campionamenti senza mai uscire dal gioco. Forse non scientifico, ma è un buon metodo per vedere visivamente i risultati.


2

Ecco lo pseudocodice:

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

In pytorch:

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

Non lo capisco abbastanza bene, ma Whuber mi ha detto che:

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

è anche corretto, cioè campionamento da una normale univariata per ciascuna coordinata.


0

La mia ipotesi migliore sarebbe quella di generare prima un insieme di punti distribuiti uniformemente nello spazio bidimensionale e quindi proiettare quei punti sulla superficie di una sfera usando una sorta di proiezione.

Probabilmente dovrai mescolare e abbinare il modo in cui generi i punti con il modo in cui li mappa. In termini di generazione di punti 2D, penso che le sequenze confuse a bassa discrepanza sarebbero un buon punto di partenza (cioè una sequenza confusa di Sobol) poiché di solito produce punti che non sono "raggruppati insieme". Non sono sicuro di quale tipo di mappatura usare, ma Woflram ha fatto apparire la proiezione gnonomica ... quindi forse potrebbe funzionare?

MATLAB ha un'implementazione decente di sequenze a bassa discrepanza che puoi generare usando q = sobolset(2)e mescolando usando q = scramble(q). C'è anche un toolbox per la mappatura in MATLAB con un sacco di diverse funzioni di proiezione che potresti usare nel caso in cui non volessi codificare tu stesso la mappatura e la grafica.


1
nessuna di queste proiezioni può ancora preservare l'uniformità della casualità? Ancora una volta, come posso verificare se la distribuzione finale di questi punti è veramente uniformemente distribuita sulla superficie della sfera? Grazie.
Qiang Li

Mi dispiace stavo solo parlando ipoteticamente ... Penso che le funzioni di mappatura su MATLAB ti permetterebbero di verificarlo poiché hanno alcune visualizzazioni incorporate in esse. Altrimenti, ho anche trovato un bel sito web che parla di come generare punti distribuiti uniformemente su una sfera in 3D usando cose come angoli randomizzati ecc. Hanno anche un codice C lì. Dai un'occhiata
Berk U.

3
I punti casuali uniformi su una proiezione gnomonica non saranno uniformi sulla sfera, poiché lo gnomonico non è uguale area. La proiezione proposta da Henry, -> (dalla longitudine-latitudine al rettangolo in ), è uguale area. ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.