Подтвердить что ты не робот

Использовать матрицу расстояний в 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, я не знаю, как это работает, и поэтому не знаю, как справиться с этой проблемой.

4b9b3361

Ответ 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.