Иерархическая кластеризация 1 миллиона объектов

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

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

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

2 ответов


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

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

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

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

для подхода с плоским кластером, K-d_tree s работайте отлично для пунктов в 2d, 3d, 20d, даже 128d -- не ваш случай. Я почти ничего не знаю о clustering text; Locality-sensitive_hashing ?

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

добавил: см. Также
google-все пары-сходство-поиск "Алгоритмы поиска всех подобных пар векторов в разреженных векторных данных", Beyardo et el. 2007
Итак, иерархическая кластеризация-эвристики


проблема, вероятно, в том, что они попытаются вычислить полную 2D-матрицу расстояний (около 8 ГБ наивно с двойной точностью), а затем их алгоритм будет работать в O(n^3) в любом случае время.

вы должны серьезно рассмотреть вопрос об использовании разные кластеризации. Иерархическая кластеризация происходит медленно, и результаты обычно не являются убедительными. В частности, для миллионов объектов, где вы не можете просто посмотреть на дендрограмму, чтобы выбрать подходящую отрезать.

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

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