2011-04-19 488 views
3

我使用模塊hcluster從距離矩陣計算樹狀圖。我的距離矩陣是這樣生成的數組的數組: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只能用於壓縮矢量,或者我在那裏犯錯誤。

感謝您的幫助!

回答

2

我敲了一個類似於你的快速隨機的例子,並遇到同樣的問題。 在文檔字符串中的確如此:

對濃縮距離矩陣y執行分層/凝聚聚類。 y必須是:數學:{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. 

所以我認爲,該接口不允許距離矩陣的傳遞。 相反,它認爲你將它傳遞給n維的觀測向量m。 因此,結果的差異?

這是否合理?

其他只是看看代碼本身我相信你可以調試它,並找出你的例子爲什麼不同。

乾杯 馬特

+0

馬特你好,非常感謝您的回覆。聽到傳遞矢量是要走的道路是令人欣慰的。 – 2011-04-20 14:37:55