3D lineare Regression

8

Ich möchte ein Programm schreiben, das bei einer Liste von Punkten im 3D-Raum, die als ein Array von x-, y-, z-Koordinaten im Fließkomma-Punkt dargestellt werden, eine bestpassende Linie in diesem Raum ausgibt. Die Linie kann / sollte die Form eines Einheitsvektors und eines Punktes auf der Linie haben.

Das Problem ist, dass ich nicht weiß, wie das zu machen ist. Das nächste, was ich gefunden habe, war dieser Link, obwohl ich ehrlich gesagt nicht verstanden habe, wie er von Gleichung auf ging Gleichung und als wir zu Matrizen kamen, war ich ziemlich verloren.

Gibt es eine Verallgemeinerung der einfachen linearen 2D-Regression, die ich (mathematisch) verwenden kann / kann, wenn / wie die oben beschriebene Methode funktioniert (und was man tun müsste, um die am besten geeignete Linie zu berechnen)? )?

    
Jimmy 14.07.2014, 23:27
quelle

1 Antwort

16

Lineare Regression

Es gibt eine Standardformel für die N-dimensionale lineare Regression von

Bei dem Ergebnis ist ein Vektor der Größe n + 1, der die Koeffizienten der Funktion angibt, die am besten zu den Daten passt.

In Ihrem Fall ist n = 3. Während X ist eine mx (n + 1) Matrix, die Design-Matrix genannt wird - in Ihrem Fall mx4. Um die Design-Matrix zu konstruieren, müssen Sie einfach jeden Datenpunkt-Koordinatenwert (x1, x2, ...) in eine Reihe von X kopieren und zusätzlich die Zahl 1 in Spalte 1 auf jeder Reihe platzieren. Der Vektor y hat die Werte, die diesen Koordinaten zugeordnet sind. Die Begriffe und sind die " Transponieren von X "und das" Inverse des Produktes der Transponierten von X und X. " Dieser letzte Term kann rechenintensiv sein, um zu erhalten, weil eine Matrix zu invertieren ist O (n ^ 3), aber für Sie n = 4, so lange wie n weniger als 5000, kein Problem.

Ein Beispiel

Nehmen wir an, Sie haben Datenpunkte (6,4,11) = 20, (8,5,15) = 30, (12,9,25) = 50 und (2,1,3) = 7. In diesem Fall

Dann müssen Sie die Dinge einfach multiplizieren und Sie können direkt erhalten. Multiplikation von Matrizen ist einfach und obwohl komplizierter, die Umkehrung einer Matrix ist ziemlich einfach ( siehe hier zum Beispiel ). Aber für wissenschaftliche Computersprachen wie Matlab, Octave und Julia (die ich mit illustrieren werde) ist es ein One-Liner.

%Vor%

Überprüfung ...

%Vor%

In Julia können Matlab- und Octave-Matrizen einfach mit * multipliziert werden, während der Transponieroperator 'ist. Beachten Sie hier, dass ich pinv (die Pseudoinverse) verwendet habe, was notwendig ist (nicht dieses Mal), wenn die Daten zu redundant sind und eine nicht invertierbare X-X-Transponierung verursachen, bedenken Sie dies, wenn Sie sich dafür entscheiden, die Matrixinversion selbst zu implementieren / p>

Stattdessen PCA

Die Hauptkomponentenanalyse (PCA) ist eine Technik zur Dimensionsreduktion, das Ziel ist es, einen k-dimensionalen Raum aus einem n-dimensionalen Raum zu finden, so dass der Projektionsfehler minimiert wird. Im allgemeinen Fall sind n und k beliebig, aber in diesem Fall ist n = 3 und k = 1. Es gibt 4 Hauptschritte.

Schritt 1: Datenvorverarbeitung

Damit die Standardmethode funktioniert, muss man zuerst die Mittelwertnormalisierung durchführen und möglicherweise auch die Daten so skalieren, dass der Algorithmus nicht aus einem Gleitkommafehler ausfällt. Im letzteren Fall, das heißt, wenn der Wertebereich einer Dimension relativ groß ist, könnte es ein Problem geben (wie -1000 bis 1000 in einer Dimension gegenüber -0,1 bis 0,2). In der Regel sind sie jedoch nahe genug. Die Normalisierung bedeutet für jede Dimension einfach, subtrahiere den Durchschnitt von jedem Datenpunkt, so dass der resultierende Datensatz um den Ursprung zentriert ist. Nehmen Sie das Ergebnis und speichern Sie jeden Datenpunkt (x1, x2, ... xn) als eine Zeile in einer großen Matrix X.

%Vor%

finde die Durchschnittswerte

%Vor%

Normalisieren ...

%Vor%

Schritt 2: Berechne zur Kovarianzmatrix

Die Kovarianzmatrix sigma ist einfach

wobei m die Anzahl der Datenpunkte ist.

Schritt 3: Führen Sie die Singulärwertzerlegung durch

Hier ist es am besten, nur eine Bibliothek zu finden, die die Kovarianzmatrix nimmt und die Antwort ausspuckt. Es gibt viele und hier sind einige von ihnen; in Python in R , in Java , und natürlich in Octave, Julia, Matlab (wie R) ist es ein anderer Liner svd .

Führen Sie SVD in der Kovarianzmatrix

aus %Vor%

Schritt 4: Suchen Sie die Zeile

Nimm die erste Komponente (für k Dimensionen würdest du die ersten k Komponenten nehmen)

%Vor%

Dies ist die Zeile, die den Projektionsfehler minimiert

Extra Credit: Zurückgehen

Sie können sogar die Approximation der ursprünglichen Werte wiederherstellen, aber sie werden alle auf derselben Linie ausgerichtet und projiziert. Verbinde die Punkte, um ein Liniensegment zu erhalten.

Erhalte die reduzierte Dimension jedes der Datenpunkte in X (da 1-D jeweils 1 Wert ist):

%Vor%

Geh zurück in die andere Richtung; die ursprünglichen Werte aber alle liegen auf derselben (optimalen) Linie

%Vor%     
waTeim 15.07.2014 05:02
quelle

Tags und Links