Przede wszystkim redukcja wymiarów jest stosowana, gdy masz wiele współzmiennych wymiarów i chcesz zmniejszyć rozmiar problemu, obracając punkty danych do nowej ortogonalnej podstawy i przyjmując tylko osie o największej wariancji. Dzięki 8 zmiennym (kolumnom) przestrzeń jest już mało wymiarowa, więc dalsze zmniejszanie liczby zmiennych raczej nie rozwiąże problemów technicznych związanych z rozmiarem pamięci, ale może mieć duży wpływ na jakość zestawu danych. W konkretnym przypadku bardziej obiecujące jest spojrzenie na naukę onlinemetody Z grubsza mówiąc, zamiast pracować z całym zestawem danych, metody te biorą niewielką ich część (często określane jako „mini-partie”) i budują model przyrostowo. (Osobiście lubię interpretować słowo „online” jako odniesienie do jakiegoś nieskończenie długiego źródła danych z Internetu, takiego jak kanał na Twitterze, gdzie po prostu nie można załadować całego zestawu danych jednocześnie).
Ale co, jeśli naprawdę chcesz zastosować technikę zmniejszania wymiarów, taką jak PCA, do zestawu danych, który nie mieści się w pamięci? Zwykle zestaw danych jest reprezentowany jako macierz danych X o rozmiarze n x m , gdzie n jest liczbą obserwacji (wierszy), a m jest liczbą zmiennych (kolumn). Zazwyczaj problemy z pamięcią wynikają tylko z jednej z tych dwóch liczb.
Zbyt wiele obserwacji (n >> m)
Gdy masz zbyt wiele obserwacji , ale liczba zmiennych jest od małej do umiarkowanej, możesz stopniowo tworzyć macierz kowariancji . Rzeczywiście, typowy PCA polega na skonstruowaniu macierzy kowariancji o rozmiarze m x m i zastosowaniu do niej dekompozycji wartości pojedynczych. Przy m = 1000 zmiennych typu float64 macierz kowariancji ma rozmiar 1000 * 1000 * 8 ~ 8 Mb, co łatwo mieści się w pamięci i może być używane z SVD. Wystarczy więc zbudować macierz kowariancji bez ładowania całego zestawu danych do pamięci - dość wykonalne zadanie .
Alternatywnie możesz wybrać małą reprezentatywną próbkę ze swojego zestawu danych i zbliżyć macierz kowariancji . Ta matryca będzie miała takie same właściwości jak normalnie, tylko nieco mniej dokładna.
Zbyt wiele zmiennych (n << m)
Z drugiej strony, czasami, gdy masz zbyt wiele zmiennych , sama macierz kowariancji nie pasuje do pamięci. Np. Jeśli pracujesz z obrazami 640x480, każda obserwacja ma 640 * 480 = 307200 zmiennych, co skutkuje macierzą kowariancji 703 Gb! To zdecydowanie nie jest to, co chciałbyś zachować w pamięci komputera, a nawet w pamięci klastra. Musimy więc zmniejszyć wymiary bez budowania macierzy kowariancji.
Moja ulubiona metoda to losowa projekcja . Krótko mówiąc, jeśli masz zestaw danych X o rozmiarze n x m , możesz go pomnożyć przez jakąś rzadką losową macierz R o rozmiarze m x k (z k << m ) i otrzymać nową macierz X ' o znacznie mniejszym rozmiarze n x k o w przybliżeniu takich samych właściwościach jak oryginalna. Dlaczego to działa? Cóż, powinieneś wiedzieć, że PCA ma na celu znalezienie zestawu osi ortogonalnych (głównych komponentów) i rzutowanie danych na pierwsze kz nich. Okazuje się, że rzadkie wektory losowe są prawie ortogonalne, a zatem mogą być również wykorzystane jako nowa podstawa.
I oczywiście nie musisz pomnożyć całego zestawu danych X przez R - możesz przetłumaczyć każdą obserwację x na nową podstawę osobno lub w mini-partiach.
Istnieje również nieco podobny algorytm o nazwie Random SVD . Nie mam z tym żadnego doświadczenia, ale możesz znaleźć przykładowy kod z objaśnieniami tutaj .
Podsumowując, oto krótka lista kontrolna do zmniejszenia wymiarów dużych zestawów danych:
- Jeśli nie masz tak wielu wymiarów (zmiennych), po prostu użyj algorytmów uczenia się online.
- Jeśli jest wiele obserwacji, ale umiarkowana liczba zmiennych (macierz kowariancji pasuje do pamięci), konstruuj macierz przyrostowo i używaj normalnego SVD.
- Jeśli liczba zmiennych jest zbyt wysoka, użyj algorytmów przyrostowych.