Как вычислить назначения кластеров из матриц привязки/расстояния в scipy в Python?

если у вас есть этот иерархический вызов кластеризации в scipy в Python:

from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)

то какой эффективный способ перейти от этого к кластерным назначениям для отдельных точек? т.е. вектор длины N, где N - количество точек, где каждая запись i - это номер кластера точки i, учитывая количество кластеров, генерируемых заданным порогом thresh, на полученную кластеризацию

Чтобы уточнить: номер кластера был бы кластером, который он использовал после применения порога к дереву. В этом случае вы получите уникальный кластер для каждого листа node для кластера, в котором он находится. Уникальный в том смысле, что каждая точка принадлежит к одному "наиболее определенному кластеру", который определяется порогом, где вы сокращаете дендрограмму.

Я знаю, что scipy.cluster.hierarchy.fclusterdata дает вам это назначение кластера в качестве возвращаемого значения, но я начинаю с настраиваемой матрицы расстояния и метрики расстояния, поэтому я не могу использовать fclusterdata. Вопрос сводится к следующему: как я могу вычислить, что fclusterdata вычисляет - кластерные назначения?

Ответы

Ответ 1

Если я правильно понимаю, это то, что fcluster делает:

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

Формирует плоские кластеры из иерархической кластеризации, определяемой матрицей привязки Z.

...

Возвращает: массив длины n. T [i] - это номер плоского кластера, к которому относится исходное наблюдение i.

Так что просто позвоните fcluster(linkage_matrix, t), где t - ваш порог.

Ответ 2

Если вы хотите видеть участников на каждом уровне кластера и в каком порядке они агломерируются, см. fooobar.com/info/328297/...