Ich habe die lineare Diskriminanzanalyse (LDA) aus der scikit-learn
maschinellen Lernbibliothek (Python) zur Dimensionsreduktion verwendet und war ein wenig neugierig auf die Ergebnisse. Ich frage mich jetzt, was die LDA scikit-learn
tut, damit die Ergebnisse anders aussehen als beispielsweise ein manueller Ansatz oder eine in R durchgeführte LDA. Es wäre großartig, wenn mir jemand hier einige Einblicke geben könnte.
Was im Grunde am meisten betrifft, ist, dass das scikit-plot
eine Korrelation zwischen den beiden Variablen zeigt, wobei es eine Korrelation 0 geben sollte.
Für einen Test habe ich den Iris-Datensatz verwendet und die ersten beiden linearen Diskriminanten sahen folgendermaßen aus:
IMG-1. LDA via Scikit-Learn
Dies stimmt im Wesentlichen mit den Ergebnissen überein, die ich in der Dokumentation zu scikit-learn hier gefunden habe.
Nun ging ich Schritt für Schritt die LDA durch und bekam eine andere Projektion. Ich habe verschiedene Ansätze ausprobiert, um herauszufinden, was los war:
IMG-2. LDA auf Rohdaten (keine Zentrierung, keine Standardisierung)
Und hier wäre der schrittweise Ansatz, wenn ich zuerst die Daten standardisieren würde (z-Score-Normalisierung; Einheitsvarianz). Ich habe dasselbe nur mit Mittelwertzentrierung gemacht, was zu demselben relativen Projektionsbild führen sollte (und was es tatsächlich tat).
IMG-3. Schrittweise LDA nach Mittelwertzentrierung oder Standardisierung
IMG-4. LDA in R (Standardeinstellungen)
LDA in IMG-3, in dem ich die Daten zentriert habe (was der bevorzugte Ansatz wäre), sieht genauso aus wie der, den ich in einem Beitrag von jemandem gefunden habe, der die LDA in R durchgeführt hat
Code als Referenz
Ich wollte nicht den gesamten Code hier einfügen, habe ihn jedoch als IPython-Notizbuch hier hochgeladen und in die verschiedenen Schritte unterteilt (siehe unten), die ich für die LDA-Projektion verwendet habe.
- Schritt 1: Berechnen der d-dimensionalen Durchschnittsvektoren
Schritt 2: Berechnen der Streumatrizen
2.1 Die Streumatrix wird nach folgender Gleichung berechnet:
2.2 Die Zwischenklassen-Streumatrix wird durch die folgende Gleichung berechnet: wobei der Gesamtmittelwert ist.S B = c ≤ i = 1 n i ( m i - m ) ( m i - m ) T m
Schritt 3. Lösen des verallgemeinerten Eigenwertproblems für die Matrix
3.1. Sortieren der Eigenvektoren durch Verringern der Eigenwerte
3.2. Auswahl von k Eigenvektoren mit den größten Eigenwerten. Kombinieren der beiden Eigenvektoren mit den höchsten Eigenwerten, um unsere dimensionale Eigenvektormatrix zu konstruierenW
Schritt 5: Transformieren der Samples in den neuen Unterraum
quelle
Antworten:
Update: Dank dieser Diskussion
scikit-learn
wurde das Update durchgeführt und funktioniert nun korrekt. Den LDA-Quellcode finden Sie hier . Das ursprüngliche Problem war auf einen kleinen Fehler zurückzuführen (siehe diese Github-Diskussion ), und meine Antwort zeigte tatsächlich nicht richtig darauf (entschuldige mich für die verursachte Verwirrung). Da das alles keine Rolle mehr spielt (Fehler behoben), habe ich meine Antwort überarbeitet, um mich darauf zu konzentrieren, wie LDA über SVD gelöst werden kann, was der Standardalgorithmus in istscikit-learn
.Nach der Definition von Streumatrizen innerhalb und zwischen Klassen und besteht die in Ihrer Frage Standard-LDA-Berechnung darin, Eigenvektoren von als diskriminante Achsen ( siehe zB hier ). Dieselben Achsen können jedoch auf eine etwas andere Weise berechnet werden, indem eine Weißmachermatrix verwendet wird:ΣW ΣB Σ- 1WΣB
Berechne . Dies ist eine Aufhellungstransformation in Bezug auf die gepoolte Kovarianz innerhalb der Klasse (siehe meine verknüpfte Antwort für Details).Σ- 1 / 2W
Beachten Sie, dass wenn Sie EIGEN-Zersetzung , dann . Man beachte auch, dass man dasselbe berechnet, indem man eine SVD gepoolter Daten innerhalb einer Klasse durchführt: .ΣW= U S U⊤ Σ- 1 / 2W= U S- 1 / 2U⊤ XW= U L V⊤⇒ Σ- 1 / 2W= U L- 1U⊤
Finden Eigenvektoren von , nennen wir sie . A *Σ- 1 / 2WΣBΣ- 1 / 2W EIN∗
Man beachte wiederum, dass man es berechnen kann, indem man eine SVD von Daten zwischen Klassen , die mit transformiert wurden , dh Daten zwischen Klassen, die in Bezug auf die innerhalb der Klasse weiß werden Kovarianz.XB Σ- 1 / 2W
Die Diskriminanzachsen werden durch , dh durch die Hauptachsen transformierter Daten, die erneut transformiert werden .EIN Σ- 1 / 2WEIN∗
In der Tat, wenn ein Eigenvektor der obigen Matrix ist, dann ist und Multiplikation von links mit und Definition von wir sofort :ein∗
Zusammenfassend ist LDA gleichbedeutend damit, die Matrix der Klassenmittelwerte in Bezug auf die Kovarianz innerhalb der Klasse aufzuhellen, PCA für die Klassenmittelwerte durchzuführen und die resultierenden Hauptachsen in den ursprünglichen (nicht aufgehellten) Raum zurück zu transformieren.
Dies wird z. B. in den Elementen des statistischen Lernens in Abschnitt 4.3.3 erläutert. In
scikit-learn
dieser Art und Weise ist die Standard - LDA zu berechnen , weil SVD eine Datenmatrix numerisch stabiler als Eigenzerlegung der Kovarianzmatrix ist.Beachten Sie, dass Sie anstelle von eine beliebige Whitening-Transformation verwenden können, und dass trotzdem alles genauso funktioniert. In verwendet (anstelle von ), und Es funktioniert einwandfrei (im Gegensatz zu dem, was ursprünglich in meiner Antwort geschrieben wurde).Σ- 1 / 2W L- 1U⊤ U L- 1U⊤
scikit-learn
quelle
Um diese Frage zu schließen, wurde das mit der LDA diskutierte Problem in scikit-learn 0.15.2 behoben .
quelle