2016-06-26 16 views
5

ich brauche, um zufällig einen n-dimensionalen Vektor mit der Länge 1. Meine beste Idee ist, wählen Sie einen beliebigen Punkt in der Kugel zu holen ein normalisieren es:Rechnerisch einen beliebigen Punkt auf einem n-Bereich Kommissionierung

import random 

def point(n): 
    sq = 0 
    v = [] 
    while len(v) < n: 
     x = 1 - 2*random.random() 
     v.append(x) 
     sq = sq + x*x 
     if sq > 1: 
      sq = 0 
      v = [] 
    l = sq**(0.5) 
    return [x/l for x in v] 

Das einzige Problem ist, dass die kleiner wird, wenn die Dimension steigt, so dass die Verwendung einer gleichmäßigen Verteilung von random.random sehr lange dauert, sogar für kleine n wie 17. Gibt es eine bessere (schnellere) Möglichkeit, einen zufälligen Punkt auf einer n-Kugel zu erhalten?

+0

Sie finden den Algorithmus [hier] (http://stackoverflow.com/a/34402858/4081336). –

+0

@LeandroCaniglia Nun, dieser Algorithmus befasst sich nur mit n = 3 –

+0

Per Zufall meinen Sie, dass es gleichmäßig verteilt werden muss? Diese Dinge werden ziemlich leicht schwierig, also würde ich nicht wetten, dass das, was Sie tun, jetzt in diesem Sinne funktioniert. – Bakuriu

Antwort

5

Nach Muller, M. E. "A Note on a Method for Generating Points Uniformly on N-Dimensional Spheres" müssten Sie einen Vektor von n Gauß'sche Zufallsvariablen und dividieren durch seine Länge zu erstellen:

import random 
import math 

def randnsphere(n): 
    v = [random.gauss(0, 1) for i in range(0, n)] 
    inv_len = 1.0/math.sqrt(sum(coord * coord for coord in v)) 
    return [coord * inv_len for coord in v] 

Wie in den Kommentaren von @Bakuriu angegeben, numpy.random verwenden, können Sie einen Leistungsvorteil bieten, wenn Arbeiten mit größeren Vektoren.

+0

Respekt für das Zurückschneiden in der Division. – YBerman

+0

@YBerman Ich habe das gerade wieder bearbeitet, nachdem ich es für eine vorzeitige Optimierung entfernt habe;) –

+2

Sie können 'numpy.random' verwenden, um mit diesen Vektoren umzugehen. Es ist wahrscheinlich sehr effizient. – Bakuriu

Verwandte Themen