3

モジュール 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 が圧縮されたベクトルでのみ機能するためなのか、それとも途中で間違いを犯しているのかはわかりません。

ご協力いただきありがとうございます!

4

1 に答える 1

2

私はあなたのものに似た簡単なランダムな例をノックアップし、同じ問題を経験しました. docstring では、次のように述べています。

圧縮距離行列 y に対して階層的/凝集的クラスタリングを実行します。y は :math:{n \choose 2}サイズのベクトルでなければなりません。ここで、n は距離行列でペアになっている元の観測値の数です。

ただし、コードをざっと見てみると、ベクトル形式とマトリックス形式のコードの両方で機能することが意図されているようです。hierachy.py には、マトリックスの形状に基づくスイッチがあります。ただし、重要な情報は関数リンケージの docstring にあるようです。

   - 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 次元で渡していると考えます。したがって、結果の違いは?

それは合理的に思えますか?

それ以外の場合は、コード自体を見てください。コードをデバッグして、例が異なる理由を理解できると確信しています。

乾杯マット

于 2011-04-19T13:00:36.580 に答える