Come generare punti distribuiti uniformemente nella sfera dell'unità 3-d?


11

Ho pubblicato una domanda precedente , questa è correlata ma penso che sia meglio iniziare un'altra discussione. Questa volta, mi chiedo come generare punti distribuiti uniformemente all'interno della sfera dell'unità 3-d e come controllare la distribuzione visivamente e statisticamente? Non vedo le strategie pubblicate direttamente trasferibili a questa situazione.


4
Le tecniche della domanda precedente si applicano direttamente quando si osserva che il numero di punti entro la distanza dall'origine deve essere proporzionale a . Pertanto, se si genera una variazione uniforme uniforme in insieme a un punto sulla superficie della sfera, il ridimensionamento di fa il trucco. r 3 u [ 0 , 1 ] w w u 1 / 3rr3u[0,1]wwu1/3
whuber

@whuber: forse non ho capito l'essenza delle tecniche precedenti. Fammi provare quello che hai descritto. Inoltre, quali sono i modi per verificare nuovamente l'uniformità?
Qiang Li

2
Funzione K di QQ Ripley e test chi-quadrati. Potresti anche verificare l'uniformità della proiezione radiale dei punti sulla superficie della sfera, l'uniformità del cubo delle lunghezze dei punti e l'indipendenza di quei due.
whuber

Per me, non è così ovvio cosa significhi "distribuito uniformemente" ... E probabilmente un tentativo di definirlo creerà automagicamente un algoritmo di generazione (=

@mbq, penso di definire il termine, dobbiamo avere un pdf di . fR,Θ,Φ(r,θ,ϕ)=r2
Qiang Li

Risposte:


14

Il modo più semplice è campionare i punti in modo uniforme nell'ipercubo corrispondente e scartare quelli che non si trovano all'interno della sfera. In 3D, ciò non dovrebbe accadere così spesso, circa il 50% delle volte. (Il volume dell'ipercubo è 1, il volume della sfera è )43πr3=0.523...


+1. Questa è una delle tecniche raccomandate dalle FAQ di comp.graphics.algorithms "Punti casuali uniformi sulla sfera".
David Cary,

1
E se vogliamo farlo per ? n>100
ares

2
Questo si chiama "metodo di rifiuto". Mentre funziona bene in tre dimensioni, per ventisette dimensioni, solo uno su trilioni di punti si trova nella palla 27 e non nel resto del cubo 27, quindi il metodo di rifiuto non si generalizza bene. Ne parlo perché al momento ho bisogno di campioni uniformemente in una palla di 2.440 dimensioni.
Reb.Cabin

13

Puoi anche farlo in coordinate sferiche, nel qual caso non c'è rifiuto. Prima generi il raggio e i due angoli a caso, quindi usi la formula di transizione per recuperare , e ( , , ).y z x = r sin θ cos ϕ y = r sin θ sin ϕ z = r cos θxyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

Si genera unifomly tra e . Il raggio e l'inclinazione non sono però uniformi. La probabilità che un punto sia all'interno della sfera del raggio è quindi la funzione di densità di probabilità di è . Puoi facilmente verificare che la radice cubica di una variabile uniforme abbia esattamente la stessa distribuzione, quindi è così che puoi generare . La probabilità che un punto si trovi all'interno di un cono sferico definito dall'inclinazione è o se0ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2 . Quindi la densità è . Puoi verificare che meno l'arccosina di una variabile uniforme abbia la densità corretta.θsin(θ)/2

O più semplicemente, possiamo simulare il coseno di uniformemente tra e .θ11

In R questo sembrerebbe come mostrato sotto.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

Nel corso della stesura e della modifica di questa risposta, mi sono reso conto che la soluzione è meno banale di quanto pensassi.

Penso che il metodo più semplice e più efficiente dal punto di vista computazionale sia seguire il metodo di @ whuber per generare sulla sfera unitaria come mostrato in questo post e ridimensionarli con .r(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
Questa è una risposta molto migliore a causa della mancanza di rifiuto. In spazi ad alta dimensione, il campionamento del rifiuto può essere molto costoso a causa della bassa probabilità di accettazione.
Kingledion,

2
L'ultimo bit di codice può essere adattato a dimensioni superiori, diciamo d. Per questo, sostituire tutte le istanze 3da d.
gui11aume,

0

A mio avviso, l'opzione più semplice che si generalizza anche a sfere di dimensioni superiori (che non è il caso delle coordinate sferiche e ancor meno il caso del campionamento del rifiuto) è generare punti casuali che sono prodotti di due variabili casuali dove è una variabile casuale gaussiana (cioè isotropica, cioè rivolta in qualsiasi direzione uniformemente) normalizzata in modo che si trovi sulla sfera e che è una variabile casuale uniforme in rispetto alla potenza , essendo la dimensionalità dei dati, curando il raggio.P = N / | | N | | U 1 / n N U [ 0 , 1 ] 1 / n nPP=N/||N||U1/nNU[0,1]1/nn

Et voilà!


2
Un raggio uniformemente distribuito non darà un punto uniforme nella palla ...
kjetil b halvorsen

1
Vero. Dovresti adattare un po 'la distribuzione della variabile per tener conto delle regioni a densità inferiore / superiore. U
Jean-Luc Bouchot,
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.