Кластер Python, матрица расстояний и матрица сжатых расстояний
Я использую модуль hcluster для расчета дендрограммы из матрицы расстояний. Моя матрица расстояний - это массив массивов, сгенерированных так:
import hcluster
import numpy as np
mols = (..a list of molecules)
distMatrix = np.zeros((10, 10))
for i in range(0,10):
for j in range(0,10):
sim = OETanimoto(mols[i],mols[j]) # a function to calculate similarity between molecules
distMatrix[i][j] = 1 - sim
Затем я использую команду distVec = hcluster.squareform(distMatrix)
преобразовать матрицу в сжатый вектор и вычислить матрицу связи с vecLink = hcluster.linkage(distVec)
,
Все это работает нормально, но если я вычислю матрицу связи, используя матрицу расстояний, а не сжатый вектор matLink = hcluster.linkage(distMatrix)
Я получаю другую матрицу связи (расстояния между узлами намного больше, а топология немного отличается)
Теперь я не уверен, так ли это, потому что hcluster работает только с конденсированными векторами или я делаю ошибки по пути туда.
Спасибо за вашу помощь!
1 ответ
Я выбрал быстрый случайный пример, похожий на ваш, и столкнулся с той же проблемой. В документации указано:
Выполняет иерархическую / агломерационную кластеризацию на сжатой матрице расстояний y. у должен быть: math:{n \choose 2}
размерный вектор, где n - число исходных наблюдений, спаренных в матрице расстояний.
Тем не менее, после быстрого просмотра кода кажется, что он предназначен для работы как с векторным, так и с матричным кодом: в hierachy.py есть переключатель, основанный на форме матрицы. Однако кажется, что ключевой бит информации находится в строке документации связки функций:
- Q : ndarray
A condensed or redundant distance matrix. A condensed
distance matrix is a flat array containing the upper
triangular of the distance matrix. This is the form that
``pdist`` returns. Alternatively, a collection of
:math:`m` observation vectors in n dimensions may be passed as
a :math:`m` by :math:`n` array.
Поэтому я думаю, что интерфейс не позволяет передавать матрицу расстояний. Вместо этого он думает, что вы передаете его m
векторы наблюдения в n измерениях. Отсюда разница в результате?
Это кажется разумным?
Еще просто взгляните на сам код, я уверен, что вы сможете отладить его и выяснить, почему ваши примеры отличаются.
Ура Мэтт