Перш за все, зменшення розмірності застосовується, коли у вас є багато коваріантних розмірів і ви хочете зменшити розмір проблеми, обертаючи точки даних на нову ортогональну основу і беручи лише осі з найбільшою дисперсією. За допомогою 8 змінних (стовпців) ваш простір вже низькомірний, зменшення кількості змінних додатково навряд чи вирішить технічні проблеми з розміром пам'яті, але може сильно вплинути на якість набору даних. У вашому конкретному випадку більш перспективним є вивчення онлайн-навчанняметоди. Грубо кажучи, замість того, щоб працювати з усім набором даних, ці методи беруть частину з них (часто їх називають "міні-партіями") і будують модель поступово. (Мені особисто подобається трактувати слово "онлайн" як посилання на якийсь нескінченно довгий джерело даних з Інтернету, як канал каналу Twitter, де ви просто не можете завантажити весь набір даних відразу).
Але що робити, якщо ви дійсно хотіли застосувати техніку зменшення розмірності, як PCA, до набору даних, який не вписується в пам'ять? Зазвичай набір даних представлений у вигляді матриці даних X розміром n x m , де n - кількість спостережень (рядків) і m - кількість змінних (стовпців). Зазвичай проблеми з пам'яттю виникають лише з одного з цих двох номерів.
Занадто багато спостережень (n >> м)
Якщо у вас занадто багато спостережень , але кількість змінних від невеликої до помірної, ви можете будувати матрицю коваріації поступово . Дійсно, типовий PCA складається з побудови коваріаційної матриці розміром m x m та застосування до неї розкладання сингулярного значення. З m = 1000 змінних типу float64 матриця коваріації має розмір 1000 * 1000 * 8 ~ 8Mb, яка легко вписується в пам'ять і може використовуватися з SVD. Тож вам потрібно лише створити коваріаційну матрицю без завантаження всього набору даних у пам'ять - досить простежується завдання .
Крім того, ви можете вибрати невеликий представницький зразок зі свого набору даних та наблизити матрицю коваріації . Ця матриця матиме всі ті ж властивості, що і звичайна, лише трохи менш точна.
Забагато змінних (n << м)
З іншого боку, іноді, коли у вас занадто багато змінних , сама матриця коваріації не впишеться в пам'ять. Наприклад, якщо ви працюєте з зображеннями 640x480, кожне спостереження має 640 * 480 = 307200 змінних, що призводить до коваріаційної матриці 703Gb! Це точно не те, що ви хотіли б зберегти в пам’яті свого комп’ютера або навіть у пам’яті свого кластера. Тому нам потрібно зменшити розміри, не будуючи взагалі матриці коваріації.
Мій улюблений метод для цього - випадкова проекція . Якщо коротко, якщо у вас є набір даних X розміром n x m , ви можете помножити його на деяку розріджену випадкову матрицю R розміру m x k (з k << m ) та отримати нову матрицю X ' значно меншого розміру n x k з приблизно тими ж властивостями , що і оригінальний. Чому це працює? Ну, ви повинні знати, що PCA має на меті знайти набір ортогональних осей (основних компонентів) та спроектувати ваші дані на перший kїх. Виявляється, розріджені випадкові вектори майже ортогональні, і тому вони також можуть використовуватися як нова основа.
І, звичайно, не потрібно множувати весь набір даних X на R - ви можете перевести кожне спостереження x в нову основу окремо або в міні-партії.
Існує також дещо схожий алгоритм, який називається Random SVD . Я не маю реального досвіду з цим, але ви можете знайти приклад коду з поясненнями тут .
Нижче наведено короткий контрольний список зменшення розмірності великих наборів даних:
- Якщо у вас не так багато вимірів (змінних), просто використовуйте онлайн-алгоритми навчання.
- Якщо спостережень багато, але помірна кількість змінних (коваріаційна матриця вписується в пам'ять), побудуйте матрицю поступово і використовуйте звичайний SVD.
- Якщо кількість змінних занадто велика, використовуйте алгоритми покрокових змін.