Aby przeprowadzić analizę głównego składnika (PCA), należy odjąć średnie z każdej kolumny od danych, obliczyć macierz współczynnika korelacji, a następnie znaleźć wektory własne i wartości własne. Cóż, raczej to zrobiłem, aby zaimplementować go w Pythonie, z wyjątkiem tego, że działa tylko z małymi macierzami, ponieważ metoda znajdowania macierzy współczynnika korelacji (corrcoef) nie pozwala mi na użycie tablicy o wysokiej wymiarowości. Ponieważ muszę go używać do obrazów, moja obecna implementacja naprawdę mi nie pomaga.
Czytałem, że można po prostu wziąć macierz danych i obliczyć D D ⊤ / n zamiast D ⊤ D / n , ale to nie działa dla mnie. Nie jestem do końca pewien, czy rozumiem, co to znaczy, poza tym, że ma to być macierz n × n zamiast p × p (w moim przypadku p ≫ n ). Czytałem o tych z samouczków na temat własnych twarzy, ale żaden z nich nie wyjaśnił tego w taki sposób, że naprawdę mogłem to zrozumieć.
Krótko mówiąc, czy istnieje prosty algorytmiczny opis tej metody, abym mógł ją zastosować?
Odpowiedzi:
Najłatwiejszym sposobem wykonania standardowego PCA jest wyśrodkowanie kolumn macierzy danych (zakładając, że kolumny odpowiadają różnym zmiennym) poprzez odjęcie średnich kolumn, a następnie wykonanie SVD. Lewe wektory w liczbie pojedynczej, pomnożone przez odpowiednią wartość w liczbie pojedynczej, odpowiadają (szacowanym) głównym składnikom. Odpowiednie wektory w liczbie pojedynczej odpowiadają (szacunkowym) kierunkom składowych głównych - są one takie same jak wektory własne podane przez PCA. Wartości w liczbie pojedynczej odpowiadają odchyleniom standardowym głównych składników (pomnożonemu przez współczynnik pierwiastka n, gdzie n jest liczbą wierszy w macierzy danych) - tak samo jak pierwiastek kwadratowy wartości własnych podanych przez PCA.
Jeśli chcesz wykonać PCA na macierzy korelacji, musisz zastosować standaryzację kolumn macierzy danych przed zastosowaniem SVD. Sprowadza się to do odjęcia średnich (centrowanie), a następnie podzielenia przez odchylenia standardowe (skalowanie).
To będzie najbardziej wydajne podejście, jeśli chcesz mieć pełną PCA. Za pomocą algebry możesz zweryfikować, że daje to tę samą odpowiedź, co rozkład widmowy macierzy kowariancji próbki.
Istnieją również wydajne metody obliczania częściowego SVD, gdy potrzebujesz tylko kilku komputerów. Niektóre z nich są wariantami iteracji mocy. Algorytm Lanczosa jest przykładem, który jest także związany z cząstkowych najmniejszych kwadratów. Jeśli twoja matryca jest ogromna, możesz być lepiej z przybliżoną metodą. W takim przypadku istnieją również statystyczne powody, dla których należy zalegalizować PCA.
źródło
To, co teraz robisz, jest bliskie, ale musisz upewnić się, że pomnożysz wektory własne z
(data . data.T) / lines
lewej stronydata.T
, aby uzyskać wektory własne(data.T . data) / lines
. Czasami nazywa się to „transpozycją”.źródło
Wygląda na to, że chcesz algorytmu NIPALS do wykonywania PCA. Jest to bardzo popularny algorytm wśród statystyk. Ma wiele zalet:
Opis
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares
Algorytm
Oto prosty i doskonały opis algorytmu (w sekcji 1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf
Pamiętaj, aby najpierw zrobić średnią skalę środkową przed wykonaniem PCA, ponieważ jest wrażliwa na skalę.
źródło
Aby dodać odpowiedź Gileada, są one obliczeniowo tańszymi algorytmami dla skróconych PCA. NIPALS jest rzeczywiście bardzo popularny, ale odniosłem duży sukces dzięki przybliżonym metodom, które wykonują szereg dopasowań na danych częściowych (co często nazywane jest PCA przez losową projekcję). Zostało to omówione w wątku metaoptymalizacji .
Jak wspomniałeś w Pythonie, pozwól mi zauważyć , że algorytm jest zaimplementowany w scikit-learn : klasie PCA . W szczególności jest stosowany w przykładzie demonstrującym powierzchnie własne .
źródło