Иерархическая кластеризация 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 миллиона в вашей системе.