кластер Python, матрица расстояний и матрица сжатых расстояний - PullRequest
3 голосов
/ 19 апреля 2011

Я использую модуль 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 Ответ

2 голосов
/ 19 апреля 2011

Я выбрал быстрый случайный пример, похожий на ваш, и столкнулся с той же проблемой.В строке документации написано:

Выполняет иерархическую / агломерационную кластеризацию на сжатой матрице расстояний y.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 измерениях.Отсюда и разница в результате?

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

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

Ура Мэтт

...