У меня есть 1 миллион 5-мерных точек, которые мне нужно сгруппировать в k кластеров с k < 1 миллион. В каждом кластере две точки не должны быть слишком далеко друг от друга (например, они могут быть ограничивающими сферами с заданным радиусом). Это означает, что, вероятно, должно быть много кластеров размером 1.
Но! Мне нужно, чтобы время работы было значительно ниже n ^ 2. n log n или так должно быть хорошо. Причина, по которой я делаю эту кластеризацию, заключается в том, чтобы избежать вычисления матрицы расстояния всех n точек (которая занимает n ^ 2 раза или много часов), вместо этого я хочу просто вычислить расстояния между кластерами.
Я попробовал алгоритм k-means pycluster, но быстро понял, что он слишком медленный. Я также пробовал следующий жадный подход:
-
Разделите пространство на 20 частей в каждом измерении. (так что всего 20 ^ 5 штук). Я буду хранить кластеры в этих сетчатых коробках, согласно их центроидам.
-
Для каждой точки извлекайте сетчатые ячейки, находящиеся в пределах r (радиус максимальной ограничивающей сферы). Если есть достаточно кластер, добавьте его в этот кластер, иначе создайте новый кластер.
Однако, похоже, это дает мне больше кластеров, чем я хочу. Я также реализовал аналогичные ему методы дважды, и они дают очень разные ответы.
Существуют ли какие-либо стандартные подходы к кластеризации быстрее, чем n ^ 2 раза? Вероятностные алгоритмы в порядке.