Ich versuche, die Dimensionalität und das Rauschen eines Datensatzes zu reduzieren, indem ich eine PCA für den Datensatz durchführe und die letzten PCs wegwerfe. Danach möchte ich einige Algorithmen für maschinelles Lernen auf den verbleibenden PCs verwenden und daher die Daten normalisieren, indem ich die Varianz der PCs anpasse, damit die Algorithmen besser funktionieren.
Eine einfache Möglichkeit besteht darin, die Varianz einfach auf Einheitswerte zu normalisieren. Der erste PC enthält jedoch mehr Abweichungen vom ursprünglichen Datensatz als die folgenden, und ich möchte ihm immer noch mehr "Gewicht" geben. Deshalb habe ich mich gefragt: Gibt es eine einfache Möglichkeit, die Varianz einfach aufzuteilen und mit weniger Abweichungen an die PCs weiterzugeben?
Eine andere Möglichkeit besteht darin, die PCs wieder dem ursprünglichen Merkmalsraum zuzuordnen. In diesem Fall würde sich jedoch auch die Dimensionalität auf den ursprünglichen Wert erhöhen.
Ich denke, es ist besser, die resultierenden Spalten orthogonal zu halten, aber es ist im Moment nicht notwendig.
quelle
Antworten:
Mir ist nicht ganz klar, dass Sie fragen, was Sie wirklich brauchen: Ein üblicher Vorverarbeitungsschritt beim maschinellen Lernen ist die Reduzierung der Dimensionalität + das Aufhellen, was bedeutet, PCA durchzuführen und die Komponenten zu standardisieren, sonst nichts. Aber ich werde mich trotzdem auf Ihre Frage konzentrieren, wie sie formuliert ist, weil sie interessanter ist.
Sei die zentrierte n × d- Datenmatrix mit Datenpunkten in Zeilen und Variablen in Spalten. PCA beträgt Singulärwertzergliederung X = U S V ⊤ ≈ U k S k V ⊤ k , wo die Dimensionsreduktion halten wir nur auszuführen k Komponenten. Eine orthogonale "Faktorrotation" dieser Komponenten impliziert die Auswahl einer orthogonalen k × k- Matrix R und deren Einfügung in die Zerlegung: X ≈ U k S k V.X. n × d
Jetzt sind wir bereit, das Problem in mathematischen Begriffen zu formulieren: gegebene nicht gedrehte Belastungen , finde die RotationsmatrixRso, dass die gedrehten LadungenLRin jeder Spalte die gleiche Quadratsumme haben.L = V.kS.k/ n - 1- -- -- -- -- -√ R. L R.
Lass es uns lösen. Spaltenquadratsummen nach der Drehung sind gleich den diagonalen Elementen von Dies ist sinnvoll: Durch Rotation werden einfach die Varianzen von Komponenten, die ursprünglich durchs 2 i /(n-1) gegebensind, gemäß dieser Formel zwischen ihnen neu verteilt. Wir müssen sie so umverteilen, dass sie alle gleich ihrem Durchschnittswertμ werden.
Ich glaube nicht, dass es dafür eine geschlossene Lösung gibt, und tatsächlich gibt es viele verschiedene Lösungen. Eine Lösung kann jedoch leicht sequentiell erstellt werden:
Beispiel
Getan.
Ich habe das Matlab-Skript geschrieben, das diesen Algorithmus implementiert (siehe unten). Für diese Eingabematrix lautet die Folge der Drehwinkel:
Komponentenabweichungen nach jedem Schritt (in Zeilen):
Die endgültige Rotationsmatrix (Produkt aus drei 2D-Rotationsmatrizen):
Hier ist der Code:
Hier ist der Code in Python, der von @feilong bereitgestellt wird:
quelle
mu
.hat aber nicht gezeigt, woher diese Gleichung kommt; wahrscheinlich denken, dass es ohne Erklärung offensichtlich ist. Offensichtlich oder nicht, ich glaube, es lohnt sich zu erklären - irgendwie. Meine Antwort zeigt einen Weg.
quelle
Wenn ich die Dinge richtig interpretiere, meinen Sie, dass die erste Hauptkomponente (Eigenwert) den größten Teil der Varianz in den Daten erklärt. Dies kann passieren, wenn Ihre Komprimierungsmethode linear ist. Möglicherweise gibt es jedoch nichtlineare Abhängigkeiten in Ihrem Feature-Space.
Hier ist ein Scikit-Beispiel, in dem sie eine Rastersuche durchführen, um die optimale Anzahl von Hauptkomponenten zu finden, die mithilfe von PCA beibehalten werden sollen (Hyperparameter). Schließlich wenden sie die logistische Regression auf den unteren Dimensionsraum an: http://scikit-learn.org/stable/auto_examples/plot_digits_pipe.html#example-plot-digits-pipe-py
Protip: Autoencoder haben keine Closed-Form-Lösung (afaik). Wenn Ihr Kontext also Daten überträgt, können Sie Ihren Autoencoder kontinuierlich aktualisieren (komprimierte Darstellung) und so Dinge wie Konzeptdrift kompensieren. Mit pca müssen Sie den Batch-Modus von Zeit zu Zeit neu trainieren, wenn neue Daten eingehen.
Informationen zum "Gewicht" einiger Funktionen finden Sie unter Regularisierung (ich gehe von den Normen https://en.wikipedia.org/wiki/Norm_(mathematics aus ). Sie könnten auch überrascht sein, wie ähnlich die logistische Regression dem Perzeptron ist.
quelle