Использовать матрицу расстояний в scipy.cluster.hierarchy.linkage()?
У меня есть матрица расстояний n * n M
, где M_ij
- расстояние между object_i
и object_j
. Итак, как и ожидалось, он принимает следующий вид:
/ 0 M_01 M_02 ... M_0n\
| M_10 0 M_12 ... M_1n |
| M_20 M_21 0 ... M2_n |
| ... |
\ M_n0 M_n2 M_n2 ... 0 /
Теперь я хочу сгруппировать эти n объектов с иерархической кластеризацией. Python имеет реализацию этого под названием scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean')
.
В его документации говорится:
y должен быть вектором размера {n\choose 2}, где n - число исходные наблюдения, спаренные в матрице расстояний.
y: ndarray
Конденсированная или избыточная матрица расстояний. Конденсированный матрица расстояний представляет собой плоскую матрицу, содержащую верхнюю треугольную дистанционная матрица. Это форма, возвращаемая pdist. В качестве альтернативы, коллекция m векторов наблюдения в n измерениях может быть передана как массив m по n.
Я смущен этим описанием y
. Могу ли я напрямую передать свой M
в качестве входа y
?
Обновление
@hongbo-zhu-cn поднял эту проблему в GitHub. Это именно то, о чем я говорю. Однако, как новичок в GitHub, я не знаю, как это работает, и поэтому не знаю, как справиться с этой проблемой.
Ответы
Ответ 1
Похоже, что мы не можем напрямую передавать избыточную квадратную матрицу, хотя документация утверждает, что мы можем это сделать.
В интересах всех, кто сталкивается с такой же проблемой в будущем, я пишу свое решение в качестве дополнительного ответа здесь. Таким образом, ребята с копированием и вставкой могут просто начать кластеризацию.
Используйте следующий фрагмент, чтобы сконденсировать матрицу и с радостью продолжайте.
import scipy.spatial.distance as ssd
# convert the redundant n*n square matrix form into a condensed nC2 array
distArray = ssd.squareform(distMatrix) # distArray[{n choose 2}-{n-i choose 2} + (j-i-1)] is the distance between points i and j
Пожалуйста, поправьте меня, если я ошибаюсь.
Ответ 2
Теперь вы должны перейти в "матрицу сжатых расстояний", т.е. просто верхний треугольник матрицы расстояния в векторной форме:
y = M[np.triu_indices(n,1)]
Из обсуждение запроса на вызов @hongbo-zhu-cn, похоже, что решение будет заключаться в добавлении дополнительного аргумента ключевого слова в linkage
, которая позволит пользователю явно указать, что они передаются в матрице расстояния nxn, а не в матрице наблюдения mxn.