random unit vector in multi-dimensionalen Raum
Arbeite ich an einem data mining-Algorithmus, bei dem ich möchten, wählen Sie eine zufällige Richtung von einem bestimmten Punkt in der feature-Raum.
Wenn ich wählen Sie eine zufällige Zahl für jede der n Dimensionen aus [-1,1] und dann normalisieren Sie den Vektor auf die Länge 1 bekomme ich eine gleichmäßige Verteilung über alle möglichen Richtungen?
Ich spreche nur theoretisch hier, da computer-generierte Zufallszahlen sind nicht wirklich zufällig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen einfachen trick auszuwählen, die jede dimension von einer Gauß-Verteilung, dann normalisieren:
Zum Beispiel, wenn Sie möchten, dass ein 7-dimensionaler zufälliger Vektor, wählen Sie 7 zufällig Werte (aus einer Gauß-Verteilung mit Mittelwert 0 und Standardabweichung 1). Dann berechnen Sie die Größe des resultierenden Vektors mit dem Satz des Pythagoras Formel (Quadrat jeder Wert, fügen Sie die Quadrate, und nehmen Sie die Quadratwurzel des Ergebnisses). Schließlich teilen jeden Wert von der Größenordnung zu erhalten, wird eine normalisierte zufälliger Vektor.
Wenn Sie die Anzahl der Dimensionen ist groß, so hat dies den großen Vorteil, immer sofort zu arbeiten, während die Erzeugung zufälliger Vektoren, bis Sie eine finden, die zufällig eine Größenordnung kleiner als eins wird, dass der computer einfach hängen, bei mehr als einem Dutzend Dimensionen oder so, da die Wahrscheinlichkeit einer von Ihnen qualifying wird verschwindend klein.
numpy
dies wärevec = numpy.random.randn(dims); return vec / numpy.linalg.norm(vec)
Werden Sie nicht erhalten einer gleichmäßig verteilten ensemble von Winkeln mit dem Algorithmus, den Sie beschrieben. Die Winkel werden voreingenommen in Richtung der Ecken des n-dimensionalen hypercube.
Dies kann behoben werden, nachdem alle Punkte mit Entfernung von mehr als 1 vom Ursprung. Dann sind Sie den Umgang mit einem kugelförmigen eher als ein dreidimensionales (n-dimensionale) Volumen, und Ihre Winkel sollten dann gleichmäßig über die Probe-Raum.
Pseudocode:
Sei n die Anzahl der Dimensionen, K ist die gewünschte Anzahl der Vektoren:
Ich hatte das exakt gleiche Frage, wenn auch die Entwicklung eines ML-Algorithmus.
Ich kam zu dem gleichen Schluss wie Jim Lewis nach der Ziehung von Stichproben für die 2-d-Fall und Plotten Sie die resultierende Verteilung der Winkel.
Außerdem, wenn Sie versuchen, um daraus die Dichte-Verteilung für die Richtung, in 2d beim zeichnen nach dem Zufallsprinzip aus [-1,1] für die x - und y-Achse ,Sie werden sehen, dass:
f_X(x) = 1/(4*cos²(x))
, wenn 0 < x < 45⁰und
f_X(x) = 1/(4*sin²(x))
, wenn x > 45⁰wobei x der Winkel, und f_X ist die Wahrscheinlichkeits-Dichte-Verteilung.
Ich geschrieben habe über dieses hier:
https://aerodatablog.wordpress.com/2018/01/14/random-hyperplanes/
Gibt es eine boost-Implementierung des Algorithmus, dass die Stichproben aus normalverteilungen: random::uniform_on_sphere