Иерархическая кластеризация 1 миллиона объектов - PullRequest
19 голосов
/ 06 февраля 2012

Может ли кто-нибудь указать мне на инструмент иерархической кластеризации (предпочтительно в python), который может кластеризовать ~ 1 миллион объектов? Я пробовал hcluster, а также Оранжевый .

hcluster были проблемы с 18k объектами. Orange мог кластеризовать 18 тыс. Объектов за считанные секунды, но потерпел неудачу с 100 тыс. Объектов (насыщенная память и в конечном итоге произошел сбой).

Я работаю на 64-битном процессоре Xeon (2,53 ГГц) и 8 ГБ ОЗУ + 3 ГБ подкачки в Ubuntu 11.10.

Ответы [ 2 ]

15 голосов
/ 06 февраля 2012

Проблема, вероятно, заключается в том, что они попытаются вычислить полную двумерную матрицу расстояний (примерно на 8 ГБ с наивысшей точностью), и тогда их алгоритм все равно будет работать в O(n^3) раз.используя другой алгоритм кластеризации.Иерархическая кластеризация медленная, и результаты обычно не совсем убедительны.В частности, для миллионов объектов, где вы не можете просто посмотреть на дендрограмму, чтобы выбрать подходящий разрез.

Если вы действительно хотите продолжить иерархическую кластеризацию, я верю, что ELKI (Javaхотя) имеет O(n^2) реализацию SLINK.Что на 1 миллион объектов должно быть примерно в 1 миллион раз быстрее.Я не знаю, есть ли у них тоже CLINK.И я не уверен, существует ли на самом деле какой-либо алгоритм sub-O(n^3) для других вариантов, кроме односвязных и полносвязных.

Рассмотрите возможность использования других алгоритмов.k-означает, например, очень хорошо масштабируется с количеством объектов (обычно это тоже не очень хорошо, если ваши данные не очень чистые и регулярные).DBSCAN и OPTICS довольно хороши, на мой взгляд, когда вы почувствуете параметры.Если ваш набор данных является низкоразмерным, их можно довольно быстро ускорить с соответствующей структурой индекса .Затем они должны работать в O(n log n), если у вас есть индекс с O(log n) временем запроса.Что может иметь огромное значение для больших наборов данных.Лично я без проблем использовал OPTICS для набора данных изображений в 110k, поэтому я могу себе представить, что в вашей системе он увеличится до 1 миллиона.

10 голосов
/ 27 февраля 2012

Чтобы победить O (n ^ 2), вам сначала нужно будет уменьшить свои 1М очки (документы) например 1000 стопок по 1000 очков в каждой, или 100 стопок по 10 тыс. Каждая, или ...
Два возможных подхода:

  • построить иерархическое дерево, скажем, из 15k точек, затем добавить остальные по одному: время ~ 1M * Глубина дерева

  • сначала построить 100 или 1000 плоских кластеров, затем создайте свое иерархическое дерево из 100 или 1000 кластерных центров.

Насколько хорошо все это может работать, зависит критически на размер и форму вашего целевого дерева - сколько уровней, сколько уходит?
Какое программное обеспечение вы используете, и сколько часов / дней вам нужно для кластеризации?

Для подхода плоских кластеров K-d_tree с отлично работает для точек в 2d, 3d, 20d, даже 128d - не ваш случай. Я почти ничего не знаю о кластеризации текста; Локально-чувствительное_хеширование ?

Взгляните на scikit-Learn кластеризация - у него есть несколько методов, включая DBSCAN.

Добавлено: см. Также
Google-все-пар-подобия-поиска «Алгоритмы нахождения всех одинаковых пар векторов в разреженных векторных данных», Beyardo et al. 2007
SO иерархическая кластеризация-эвристика

...