Кластеризация заданных попарных расстояний с неизвестным номером кластера?

у меня есть набор объектов {obj1, obj2, obj3, ..., objn}. Я вычислил попарные расстояния всех возможных пар. Расстояния хранятся в n*n матрица M С Mij расстояние между obji и objj. Тогда естественно видеть M является симметричной матрицей.

теперь я хочу выполнить неконтролируемую кластеризацию этих объектов. После некоторых поисков я нахожу Спектральной Кластеризации может быть хорошим кандидатом, поскольку он имеет дело с такими попарно-расстояние.

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

учитывая это, пожалуйста, предложите мне некоторые методы кластеризации, которые соответствуют моему случаю, где

  1. в попарно расстояния все имеющиеся.
  2. количество кластеров неизвестно.

7 ответов


существует множество возможных методов кластеризации, и ни один из них нельзя считать "лучшим", все зависит от данных, как всегда:


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


другим подходом, который до сих пор никто не предлагал, если вам нравится вероятностная кластеризация, является байесовская непараметрия (Приоры процесса Дирихле являются простейшим случаем). Вы можете использовать мультиномиальное правдоподобие для данных типа count или многомерное гауссово правдоподобие, если ваши данные непрерывны.


вы можете попробовать многомерное шкалирование (MDS). После использования MDS для преобразования данных, подобных расстоянию, в геометрическую картину можно применить общие методы кластеризации (например, k-means) для кластеризации. См.здесь и здесь дополнительные.


вы можете попробовать использовать иерархическая кластеризация. Он имеет два типа:

  • Агломеративный или "снизу вверх" подход: каждое наблюдение начинается в собственном кластере, и пары кластеров объединяются в один движется вверх по иерархии.
  • раскол или "сверху вниз" подход: все наблюдения начинаются в один кластер и разбиения выполняются рекурсивно по мере перемещения вниз по иерархии.

вы рассматривали Кластеризация Корреляции?
Если вы внимательно прочтете раздел 2.1 в этой статье, вы увидите вероятностную интерпретацию восстановленного количества кластеров.

единственная модификация, необходимая для вашего M матрица должна установить порог, решая, какое расстояние считается " одинаковым "и какое расстояние слишком велико и должно рассматриваться как"не-одинаковое".

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


это легко сделать с помощью тега в алгоритмах кластеризации sklearn. Модель соответствует матрице попарного расстояния, а не исходным элементам.

идея, как это сделать, следующая (для случая, когда вам нужно создать матрицу попарного расстояния):

def my_metric(x, y):
   # implement your distance measure between x and y

def create_pairwise_dist(X_data):
   # create a matrix of pairwised distances between all elements in your X_data
   # for example with sklearn.metrics.pairwise.pairwise_distances
   # or scipy.spatial.distance.pdist
   # or your own code

X_data = <prepare your data matrix of features>
X_dist = create_pairwise_dist(X_data)

# then you can use DBSCAN

dbscan = DBSCAN(eps=1.3, metric='precomputed')
dbscan.fit(X_dist)