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)? )?
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.
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>
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.
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%Die Kovarianzmatrix sigma ist einfach
wobei m die Anzahl der Datenpunkte ist.
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%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
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%Tags und Links algorithm linear-regression