Как кластеризовать большие данные с помощью Python или R без ошибок памяти? - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь сгруппировать набор данных с примерно 1 100 000 наблюдений, каждое из которых имеет три значения.

Код довольно прост в R:

df11.dist <-dist(df11cl), где df11cl - это фрейм данных с тремя столбцами и 1 100 000 строк, и все значения в этом фрейме данных стандартизированы.

ошибка, которую я получаю: Error: cannot allocate vector of size 4439.0 Gb

Рекомендации по схожим проблемам включают увеличение объема оперативной памяти или порцию данных. У меня уже есть 64 ГБ ОЗУ, а моя виртуальная память составляет 171 ГБ, поэтому я не думаю, что увеличение объема ОЗУ является возможным решением. Также, насколько я знаю, порционные данные в иерархическом анализе данных дают разные результаты. Итак, кажется, что использование выборки данных не подлежит сомнению.

Я также нашел это решение , но ответы на самом деле меняют вопрос. Они технически советуют k-means. K-means может сработать, если заранее знать количество кластеров. Я не знаю количество кластеров. Тем не менее, я запустил k-means, используя различное количество кластеров, но теперь я не знаю, как оправдать выбор одного из другого. Есть какой-нибудь тест, который может помочь?

Можете ли вы порекомендовать что-нибудь в R или python?

1 Ответ

3 голосов
/ 27 октября 2019

По тривиальным причинам функция dist нуждается в квадратичной памяти.

Так, если у вас есть 1 миллион (10 ^ 6) точек, квадратичная матрица требует 10 ^ 12 записей. С двойной точностью вам нужно 8 байтов для каждой записи. При симметрии вам нужно хранить только половину записей, но это 4 * 10 ^ 12 байт. Т.е. 4 терабайта только для хранения этой матрицы. Даже если вы сохраните это на SSD или обновите свою систему до 4 ТБ ОЗУ, вычисление всех этих расстояний займет безумное количество времени.

И 1 миллион все еще довольно мал, не так ли?

Использование dist на больших данных невозможно. Конец истории.

Для больших наборов данных вам необходимо

  • использовать такие методы, как k-средних, которые не используют попарные расстояния
  • использовать методытакие как DBSCAN, которым не нужна матрица расстояний, и где в некоторых случаях индекс может уменьшить усилие до O (n log n)
  • подвыборка ваших данных, чтобы сделать их меньше

В частности, последняя вещь - хорошая идея, если у вас еще нет рабочего решения. Нет смысла бороться с масштабируемостью метода, который не работает.

...