Прежде всего, уменьшение размерности используется, когда у вас много коваризованных измерений и вы хотите уменьшить размер проблемы, поворачивая точки данных в новую ортогональную основу и выбирая только оси с наибольшей дисперсией. С 8 переменными (столбцами) ваше пространство уже является низкоразмерным, дальнейшее уменьшение количества переменных вряд ли решит технические проблемы с объемом памяти, но может сильно повлиять на качество набора данных. В вашем конкретном случае более перспективно взглянуть на онлайн-обучениеметоды. Грубо говоря, вместо того, чтобы работать со всем набором данных, эти методы берут небольшую их часть (часто называемую «мини-пакетами») за раз и строят модель постепенно. (Лично мне нравится интерпретировать слово «онлайн» как ссылку на какой-то бесконечно длинный источник данных из Интернета, такой как канал Twitter, где вы просто не можете загрузить весь набор данных одновременно).
Но что, если вы действительно хотите применить технику уменьшения размерности, такую как PCA, к набору данных, который не помещается в память? Обычно набор данных представляется в виде матрицы данных X размером n x m , где n - количество наблюдений (строк), а m - количество переменных (столбцов). Обычно проблемы с памятью происходят только от одного из этих двух чисел.
Слишком много наблюдений (n >> m)
Если у вас слишком много наблюдений , но число переменных от маленького до среднего, вы можете строить ковариационную матрицу постепенно . Действительно, типичный PCA состоит из построения ковариационной матрицы размером m x m и применения к ней разложения по сингулярному значению. При m = 1000 переменных типа float64 ковариационная матрица имеет размер 1000 * 1000 * 8 ~ 8 Мб, которая легко помещается в память и может использоваться с SVD. Таким образом, вам нужно только построить ковариационную матрицу, не загружая весь набор данных в память - довольно трудоемкая задача .
Кроме того, вы можете выбрать небольшую репрезентативную выборку из вашего набора данных и приблизить ковариационную матрицу . Эта матрица будет иметь все те же свойства, что и обычные, только чуть менее точная.
Слишком много переменных (n << m)
С другой стороны, иногда, когда у вас слишком много переменных , сама ковариационная матрица не помещается в память. Например, если вы работаете с изображениями 640x480, каждое наблюдение имеет 640 * 480 = 307200 переменных, что приводит к ковариационной матрице 703 ГБ! Это определенно не то, что вы хотели бы сохранить в памяти вашего компьютера или даже в памяти вашего кластера. Таким образом, нам нужно уменьшить размеры без построения ковариационной матрицы.
Мой любимый метод для этого - случайная проекция . Короче говоря, если у вас есть набор данных X размером n x m , вы можете умножить его на некоторую разреженную случайную матрицу R размером m x k (с k << m ) и получить новую матрицу X ' гораздо меньшего размера n x k с примерно теми же свойствами, что и оригинал. Почему это работает? Ну, вы должны знать, что PCA стремится найти набор ортогональных осей (главных компонентов) и спроецировать ваши данные на первые kих. Оказывается, что разреженные случайные векторы являются почти ортогональными и, таким образом, также могут использоваться в качестве нового базиса.
И, конечно же, вам не нужно умножать весь набор данных X на R - вы можете перевести каждое наблюдение x в новый базис отдельно или в виде мини-пакетов.
Есть также несколько похожий алгоритм, который называется Random SVD . У меня нет никакого реального опыта с этим, но вы можете найти пример кода с объяснениями здесь .
В итоге, вот краткий контрольный список для уменьшения размерности больших наборов данных:
- Если у вас не так много измерений (переменных), просто используйте алгоритмы онлайн-обучения.
- Если имеется много наблюдений, но небольшое количество переменных (ковариационная матрица помещается в память), постройте матрицу постепенно и используйте обычный SVD.
- Если число переменных слишком велико, используйте инкрементные алгоритмы.