Кластер 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 измерениях. Отсюда разница в результате?

Это кажется разумным?

Еще просто взгляните на сам код, я уверен, что вы сможете отладить его и выяснить, почему ваши примеры отличаются.

Ура Мэтт

Другие вопросы по тегам