5

Ho bisogno di una distribuzione uniforme dei punti su una sfera a 4 dimensioni. So che non è così banale come scegliere 3 angoli e usare le coordinate polari.Python Distribuzione uniforme dei punti sulla sfera a 4 dimensioni

in 3 dimensioni che uso

from random import random 

u=random() 
costheta = 2*u -1 #for distribution between -1 and 1 
theta = acos(costheta) 
phi = 2*pi*random 

x=costheta 
y=sin(theta)*cos(phi) 
x=sin(theta)*sin(phi) 

Questo dà una distribuzione uniforme di x, ye z.

Come posso ottenere una distribuzione simile per 4 dimensioni?

+0

Come generare punti distribuiti in modo uniforme su una sfera N: http://en.wikipedia.org/wiki/N-sphere#Uniformly_at_random_from_the_.28n.C2.A0.E2.88.92.C2.A01.29-sphere – unutbu

+1

wait, vuoi che i punti siano su una sfera, ma distribuiti uniformemente in x, y, z, (4a dimensione)? questo non si aggiunge a me. Non penso che i punti distribuiti uniformemente su una sfera si associno a una distribuzione uniforme in 4-spazio. –

+0

@SchighSchagh quindi non puoi eseguire simulazioni di monte carlo in 4 dimensioni? –

risposta

1

Prendere qualsiasi punto casuale nello spazio 4D e calcolare il suo vettore unitario. Questo sarà sull'unità a 4 sfere.

from random import random 
import math 
x=random.normalvariate(0,1) 
y=random.normalvariate(0,1) 
z=random.normalvariate(0,1) 
w=random.normalvariate(0,1) 
r=math.sqrt(x*x + y*y + z*z + w*w) 
x/=r 
y/=r 
z/=r 
w/=r 
print (x,y,z,w) 
+0

Certo, questo genererà un punto casuale su una 4 sfere, ma è l'uniforme di distribuzione? –

+0

@SchighSchagh: distribuito uniformemente? Sì. – Manishearth

+1

x, y, z, w sono inizialmente uniformemente casuali rispetto a R^4, ma poi subiscono una trasformazione non lineare, e non mi è ancora chiaro se OP vuole uniformemente a caso rispetto alla superficie del sfera o rispetto a R^4. EDIT: puoi specificare rispetto a ciò che rivendichi in modo uniforme a caso, e provarlo? –

5

A standard way, anche se, forse not the fastest, è quello di utilizzare il metodo di Muller per generare punti uniformemente distribuiti su una N-sfera:

import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as axes3d 

N = 600 
dim = 3 

norm = np.random.normal 
normal_deviates = norm(size=(dim, N)) 

radius = np.sqrt((normal_deviates**2).sum(axis=0)) 
points = normal_deviates/radius 

fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) 
ax.scatter(*points) 
ax.set_aspect('equal') 
plt.show() 

enter image description here

semplicemente cambiare dim = 3-dim = 4 per generare punti su una 4 sfere.

+0

Prendere una distribuzione uniforme produrrebbe una sfera campionata con una densità di punti che è più alta verso gli angoli del cubo che occuperebbe. Come dimostrare che l'uso di una distribuzione gaussiana non causerebbe anche questo problema? Sembra plausibile se lo immagino mentalmente, ma è davvero, e perché? Presumo che le distribuzioni gaussiane di numpy siano indipendenti per ogni coordinata quando si specifica una dimensione. –

+0

E per quanto riguarda le divisioni per zero? –

+1

@GuillaumeChevalier: Confesso di non capire i dettagli, ma forse troverai [questo utile schema] (https://stats.stackexchange.com/questions/7977/how-to-generate-uniformly-distributed-points -on-the-superficie-of-the-3-d-unità-SPHE # comment13055_7984). Sulla questione della divisione per zero: credo che la probabilità che il divisore sia 0 è essa stessa 0. A livello pratico, NumPy gestisce la divisione per zero emettendo un * warning * e restituendo 'NaN' (e Matplotlib salta punti pari a NaN). – unutbu

0

Mi piace la risposta di @ unutbu se il campionamento gaussiano crea davvero una distribuzione sferica equidistante (a differenza del campionamento da un cubo), ma per evitare il campionamento su una distribuzione gaussiana e per provarlo, esiste una soluzione semplice: campione su una distribuzione uniforme su una sfera (non su un cubo).

  1. Generare punti su una distribuzione uniforme .
  2. Calcolare il raggio quadrato di ciascun punto (evitare la radice quadrata).
  3. Elimina ricorda:
    • punti Scartare per cui il raggio al quadrato è maggiore di 1 (quindi, per la quale il raggio non quadratiche è maggiore di 1).
    • Gli scarti si avvicinano troppo a un raggio di zero per evitare instabilità numeriche legate alla divisione nel passaggio successivo.
  4. Per ciascun punto campionato mantenuto, dividere il punto campionato dalla norma modo da normalizzarsi così il raggio unitario.
  5. Lavare e ripetere per più punti a causa dei campioni scartati.

Questo ovviamente funziona in uno spazio n-dimensionale, poiché il raggio è sempre la norma L2 in dimensioni superiori.

È veloce in modo da evitare una radice quadrata e il campionamento su una distribuzione gaussiana, ma non è un algoritmo vettorizzato.

Problemi correlati