Как вычислить назначения кластеров из матриц привязки/расстояния в 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/...