Я разрабатываю агломеративный алгоритм восходящей кластеризации для миллионов 50-1000 размерных точек. В двух частях моего алгоритма мне нужно сравнить два кластера точек и определить разделение между двумя кластерами. Точное расстояние - это минимальное евклидово расстояние, взятое по всем парам точек P1-P2, где P1 берется из кластера C1, а P2 берется из кластера C2. Если у C1 есть X точек, а у C2 есть точки Y, то для этого требуются измерения расстояния X * Y.
В настоящее время я оцениваю это расстояние способом, требующим измерений X + Y:
- Найдите центр тяжести Ctr1 кластера C1.
- Найдите точку P2 в кластере C2, ближайшую к Ctr1. (Y сравнений.)
- Найдите точку P1 в C1, ближайшую к P2. (X сравнений.)
- Расстояние от P1 до P2 является приблизительной мерой расстояния между кластерами C1 и C2. Это верхняя граница истинного значения.
Если кластеры имеют примерно сферическую форму, это работает очень хорошо. Мои тестовые данные состоят из эллипсоидальных гауссовых кластеров, поэтому они работают очень хорошо. Однако, если кластеры имеют странные, изогнутые, изогнутые формы, это может привести к плохим результатам. Мои вопросы:
Есть ли алгоритм, который использует даже меньше измерений расстояний, чем X + Y, и в среднем дает хорошую точность?
OR
Есть ли алгоритм, который (как мой) использует измерения расстояния X + Y, но обеспечивает лучшую точность, чем мой?
(Я программирую это на C #, но описание алгоритма в псевдокоде или на любом другом языке подойдет. Избегайте ссылок на специализированные библиотечные функции из R или Matlab. Алгоритм с вероятностными гарантиями типа «95% вероятность того, что расстояние находится в пределах 5% от минимального значения "приемлемо.)
ПРИМЕЧАНИЕ. Я только что нашел этот связанный вопрос, в котором обсуждается аналогичная проблема, но не обязательно для больших размеров. Учитывая два (большие) наборы точек, как я могу эффективно найти пары, которые находятся ближе всего друг к другу?
ПРИМЕЧАНИЕ. Я только что обнаружил, что это называется проблемой бихроматической ближайшей пары.
Для контекста, вот обзор общего алгоритма кластеризации:
Первый проход объединяет самые плотные области в небольшие кластеры с использованием кривой заполнения пространства (Кривая Гильберта). Он пропускает выбросы и часто не может объединить соседние кластеры, которые очень близки друг к другу. Однако он обнаруживает характерное максимальное расстояние связи. Все точки, разделенные меньшим, чем это характерное расстояние, должны быть сгруппированы вместе. Этот шаг не имеет заранее определенного количества кластеров в качестве цели.
На втором проходе выполняется агломерация одинарных связей путем объединения кластеров, если их минимальное расстояние меньше, чем максимальное расстояние связи. Это не иерархическая кластеризация; он основан на разделах. Все кластеры, минимальное расстояние которых друг от друга меньше, чем это максимальное расстояние связи, будут объединены. Этот шаг не имеет заранее определенного количества кластеров в качестве цели.
На третьем проходе выполняется дополнительная агломерация с одной связью, сортируя все расстояния между кластерами и объединяя только кластеры до тех пор, пока количество кластеров не станет равным заранее определенному целевому количеству кластеров. Он обрабатывает некоторые выбросы, предпочитая объединять выбросы только с большими кластерами. Если имеется много выбросов (а их обычно бывает), это может не привести к уменьшению количества кластеров до целевого.
Четвертый проход объединяет все оставшиеся выбросы с ближайшим большим кластером, но не приводит к слиянию больших кластеров с другими большими кластерами. (Это предотвращает случайное слияние двух соседних кластеров из-за того, что их выбросы образуют между ними тонкую цепочку.)