Użyłem liniowej analizy dyskryminacyjnej (LDA) z scikit-learn
biblioteki uczenia maszynowego (Python) do redukcji wymiarów i byłem trochę ciekawy wyników. Zastanawiam się teraz, czym scikit-learn
zajmuje się LDA, aby wyniki wyglądały inaczej niż np. Ręczne podejście lub LDA wykonane w R. Byłoby wspaniale, gdyby ktoś mógł dać mi tutaj jakieś spostrzeżenia.
Zasadniczo najbardziej niepokojące jest to, że scikit-plot
pokazuje korelację między dwiema zmiennymi, gdzie powinna istnieć korelacja 0.
Do testu użyłem zestawu danych Iris, a pierwsze 2 liniowe dyskryminatory wyglądały tak:
IMG-1. LDA poprzez scikit-learn
Jest to zasadniczo zgodne z wynikami, które znalazłem w dokumentacji scikit-learn tutaj.
Teraz przeszedłem LDA krok po kroku i otrzymałem inną projekcję. Próbowałem różnych podejść, aby dowiedzieć się, co się dzieje:
IMG-2. LDA na surowych danych (bez centrowania, bez standaryzacji)
I tutaj byłoby podejście krok po kroku, gdybym najpierw ustandaryzował (normalizacja z-score; wariancja jednostkowa) dane. Zrobiłem to samo z samym tylko średnim środkiem, co powinno prowadzić do tego samego względnego obrazu projekcji (i co rzeczywiście zrobiło).
IMG-3. LDA krok po kroku po centralizacji lub standaryzacji
IMG-4. LDA w R (ustawienia domyślne)
LDA w IMG-3, gdzie wyśrodkowałem dane (co byłoby preferowanym podejściem), wygląda również dokładnie tak samo jak ten, który znalazłem w poście przez osobę, która wykonała LDA w R
Kod referencyjny
Nie chciałem tutaj wklejać całego kodu, ale przesłałem go tutaj jako notes IPython z podziałem na kilka kroków, których użyłem (patrz poniżej) do projekcji LDA.
- Krok 1: Obliczanie wektorów średnich wymiarów d
Krok 2: Obliczanie macierzy rozproszenia
2.2 Macierz rozproszenia między klasami jest obliczana według następującego równania: gdzie jest ogólną średnią.S B = c ∑ i = 1 n i ( m i - m ) ( m i - m ) T m
Krok 3. Rozwiązanie ogólnego problemu wartości własnej dla macierzy
3.1 Sortowanie wektorów własnych przez zmniejszenie wartości własnych
3.2 Wybór k wektorów własnych z największych wartości własnych. Łączenie dwóch wektorów własnych z najwyższymi wartościami własnymi w celu skonstruowania naszej macierzy wektorów wymiarowych wymiarowejW.
Krok 5: Przekształcenie próbek w nową podprzestrzeń
źródło
Odpowiedzi:
Aktualizacja: Dzięki tej dyskusji
scikit-learn
został zaktualizowany i działa teraz poprawnie. Jego kod źródłowy LDA można znaleźć tutaj . Pierwotny problem był spowodowany drobnym błędem (patrz ta dyskusja na githubie ), a moja odpowiedź właściwie nie wskazywała na to poprawnie (przepraszam za jakiekolwiek zamieszanie). Ponieważ to wszystko nie ma już znaczenia (błąd został naprawiony), zredagowałem moją odpowiedź, aby skupić się na tym, jak LDA można rozwiązać za pomocą SVD, który jest domyślnym algorytmemscikit-learn
.Podsumowując, LDA jest równoważne wybieleniu macierzy średnich klas w odniesieniu do kowariancji wewnątrz klasy, wykonaniu PCA na średnich klas i ponownym przekształceniu uzyskanych głównych osi w pierwotną (niebieloną) przestrzeń.
Wskazano na to np. W elementach statystycznego uczenia się , sekcja 4.3.3. W
scikit-learn
ten sposób jest domyślnym obliczyć LDA ponieważ SVD macierzy danych jest numerycznie bardziej stabilne niż eigen-rozkładu jego matrycy kowariancji.scikit-learn
źródło
Aby zamknąć to pytanie, omawiany problem z LDA został naprawiony w scikit-learn 0.15.2 .
źródło