Как сделать SVD и PCA с большими данными?

29

У меня есть большой набор данных (около 8 ГБ). Я хотел бы использовать машинное обучение для его анализа. Итак, я думаю, что я должен использовать SVD, а затем PCA, чтобы уменьшить размерность данных для эффективности. Однако MATLAB и Octave не могут загрузить такой большой набор данных.

Какие инструменты я могу использовать для SVD с таким большим объемом данных?

Дэвид С.
источник
Привет и добро пожаловать в DS! Возможно, вы могли бы немного уточнить свой набор данных. Сколько у вас строк и столбцов? Это может повлиять на возможные решения.
С. Коласса - Восстановить Монику
23711341 строк и 8 столбцов. Я мог бы попытаться удалить 1-2 столбца. Они, похоже, не связаны с моей проблемой.
Дэвид С.
Вы должны попробовать строки перед столбцами здесь. Есть ли причина, по которой вы не можете случайно выбирать строки для уменьшения размера данных? Я предполагаю, что строки здесь связаны с пользователями или чем-то
cwharland
Извините, если я не прояснил себя. Моя цель - сделать PCA. Я думаю, что SVD на данных образца не может помочь мне сделать PCA, верно?
Дэвид С.
PCA обычно реализуется путем вычисления SVD на ковариационной матрице. Вычисление ковариационной матрицы является смущающей параллельной задачей, поэтому она должна легко масштабироваться с количеством записей.
Anony-Mousse

Ответы:

41

Прежде всего, уменьшение размерности используется, когда у вас много коваризованных измерений и вы хотите уменьшить размер проблемы, поворачивая точки данных в новую ортогональную основу и выбирая только оси с наибольшей дисперсией. С 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 kk << m ) и получить новую матрицу X ' гораздо меньшего размера n x k с примерно теми же свойствами, что и оригинал. Почему это работает? Ну, вы должны знать, что PCA стремится найти набор ортогональных осей (главных компонентов) и спроецировать ваши данные на первые kих. Оказывается, что разреженные случайные векторы являются почти ортогональными и, таким образом, также могут использоваться в качестве нового базиса.

И, конечно же, вам не нужно умножать весь набор данных X на R - вы можете перевести каждое наблюдение x в новый базис отдельно или в виде мини-пакетов.

Есть также несколько похожий алгоритм, который называется Random SVD . У меня нет никакого реального опыта с этим, но вы можете найти пример кода с объяснениями здесь .


В итоге, вот краткий контрольный список для уменьшения размерности больших наборов данных:

  1. Если у вас не так много измерений (переменных), просто используйте алгоритмы онлайн-обучения.
  2. Если имеется много наблюдений, но небольшое количество переменных (ковариационная матрица помещается в память), постройте матрицу постепенно и используйте обычный SVD.
  3. Если число переменных слишком велико, используйте инкрементные алгоритмы.
ffriend
источник
3
В целом, мне нравится ваш ответ, но вступительное предложение не совсем верно. PCA не подходит для многих измерений с низкой дисперсией; скорее, он подходит для многих измерений с коррелированной дисперсией. Для данного набора данных дисперсия может быть высокой во всех измерениях, но до тех пор, пока существует высокая ковариация, PCA все же может привести к значительному уменьшению размерности.
Богатрон
1
@bogatron: хороший улов, спасибо. Фактически, я имел в виду высокую / низкую дисперсию в некоторых измерениях, возможно, не оригинальную. Например, на этом рисунке эти размеры определены двумя стрелками, а не оригинальными осями X / Y. PCA стремится найти эти новые оси и сортирует их по значению дисперсии вдоль каждой оси. В любом случае, как вы указали, это была плохая формулировка, поэтому я попытался переформулировать свою идею. Надеюсь, теперь все понятно.
друг
Это имеет смысл для меня. +1.
Богатрон
7

Не беспокойся

Первое правило программирования, которое также применимо к науке о данных: заставьте все работать над небольшой проблемой теста.

поэтому возьмите случайную выборку ваших данных, скажем, 100 000 строк. попробуйте разные алгоритмы и т. д. Как только вы получите все, что работает, чтобы вы остались довольны, вы можете попробовать большие (и большие) наборы данных - и посмотреть, как уменьшается ошибка теста по мере добавления новых данных.

Более того, вы не хотите применять SVD только к 8 столбцам: вы применяете его, когда у вас много столбцов.

seanv507
источник
1
+1, потому что вы не хотите применять SVD только к 8 столбцам: вы применяете его, когда у вас много столбцов.
С. Коласса - Восстановить Монику
6

PCA обычно реализуется путем вычисления SVD на ковариационной матрице.

Вычисление ковариационной матрицы является смущающей параллельной задачей, поэтому она масштабируется линейно с количеством записей и тривиально для распределения на нескольких машинах!

Просто сделайте один проход по вашим данным, чтобы вычислить средства. Затем второй проход для вычисления ковариационной матрицы. Это можно сделать с помощью map-Reduction легко - по сути, это то же самое, что снова вычислить средства. Условия суммирования, как в ковариации, тривиальны для распараллеливания! Вам может понадобиться обратить внимание только на цифры при суммировании многих значений одинаковой величины.

Все становится иначе, когда у вас есть огромное количество переменных . Но в системе 8 ГБ вы должны иметь возможность запускать PCA в памяти до 20 000 измерений с библиотеками BLAS. Но тогда вы можете столкнуться с проблемой, что PCA уже не так уж надежен, потому что у него слишком много степеней свободы. Другими словами: это легко перезаряжается. Я видел рекомендацию иметь как минимум 10 * d * d записей (или это было d ^ 3). Таким образом, для 10000 измерений у вас должно быть как минимум миллиард записей (из 10000 измерений ... это много!), Чтобы результат был статистически достоверным.

Anony-Мус
источник
1

Хотя вы, вероятно, можете найти некоторые инструменты, которые позволят вам сделать это на одной машине, вы попадаете в диапазон, где имеет смысл рассмотреть инструменты «больших данных», такие как Spark, особенно если вы думаете, что ваш набор данных может расти. В Spark есть компонент MLlib, который поддерживает PCA и SVD. В документации есть примеры .

Эмре
источник
1

Мы внедрили SVD в больший набор данных, используя PySpark. Мы также сравнили согласованность разных пакетов. Вот ссылка.

sergulaydore
источник
0

Я бы порекомендовал Python, если вы будете лениво оценивать файл, у вас будет минимальный объем памяти, а numpy / scipy предоставит вам доступ ко всем инструментам Octave / Matlab.

ragingSloth
источник