2017-01-01 46 views
0

我有三個矩陣進行比較。他們每個人都是5x6。我最初想要使用層次聚類來對矩陣進行聚類,以便在給定相似閾值的情況下對最相似的矩陣進行分組。距離矩陣的樹形圖或其他圖

我在python中找不到任何這樣的函數,所以我實現了手動距離度量,(p-norm where p=2)。現在我有一個3x3的距離矩陣(我認爲這也是這種情況下的相似矩陣)。

我現在試圖產生樹狀圖。這是我的代碼,這是錯的。 I 想要產生顯示最相似的矩陣的聚類的圖(可能的樹形圖)。矩陣0,1,2,0和2是相同的,應該先聚集在一起,1是不同的。

的距離矩陣如下所示:

> 0  1 2 
0 0.0 2.0 3.85e-16 
1 2.0 0.0 2.0 
2 3.85e-16 2.0 0.0 

代碼:

from scipy.cluster.hierarchy import dendrogram 
import matplotlib.pyplot as plt 
import numpy as np 
from scipy.cluster.hierarchy import linkage 
mat = np.array([[0.0, 2.0, 3.8459253727671276e-16], [2.0, 0.0, 2.0], [3.8459253727671276e-16, 2.0, 0.0]]) 
dist_mat = mat 
linkage_matrix = linkage(dist_mat, "single") 
dendrogram(linkage_matrix, color_threshold=1, labels=["0", "1", "2"],show_leaf_counts=True) 
plt.title=("test") 
plt.show() 

這是輸出: enter image description here

什麼是聯動(dist_mat的意思,「單「)?我假設輸出圖看起來像這樣,其中距離爲0和1之間的距離爲2.0(例如)。 enter image description here

是否有更好的方法來表示這些數據?是否有一個函數可以用幾個矩陣代替點,比較和形成距離矩陣,然後聚類?對於如何可視化這些矩陣之間的差異,我願意接受其他建議。

+0

這似乎是正確的,那就意味着一流的0和2的分組,然後他們兩個用1分組高度是距離,並且由於(0,2)的簇具有約〜3.4的距離,所以一切正常。 – JeD

+0

@JeD - 謝謝。是否有一個函數可以用幾個矩陣代替點,比較和形成距離矩陣,然後聚類? – amc

回答

1

linkage的第一個參數不應該是平方距離矩陣。它必須是condensed distance matrix。在你的情況下,這將是np.array([2.0, 3.8459253727671276e-16, 2])。如果傳遞的二維陣列,以linkage具有形狀(m, n)可以從距離的平方矩陣轉換爲使用scipy.spatial.distance.squareform

濃縮形式,它把它作爲mn維空間的陣列,並且它計算的距離這些點本身。這就是爲什麼當你通過平方距離矩陣時你沒有得到一個錯誤 - 但你得到了一個不正確的圖。 (這是一個無證的「功能」linkage。)

還要注意,因爲3.8e-16的距離太小,所以與點0和2之間的鏈接相關的水平線可能在plot- - 它在x軸上。

下面是您腳本的修改版本。對於這個例子,我已經將這個微小的距離改爲0.1,所以關聯的集羣不會被x軸遮擋。

import numpy as np 

from scipy.cluster.hierarchy import dendrogram, linkage 
from scipy.spatial.distance import squareform 

import matplotlib.pyplot as plt 


mat = np.array([[0.0, 2.0, 0.1], [2.0, 0.0, 2.0], [0.1, 2.0, 0.0]]) 
dists = squareform(mat) 
linkage_matrix = linkage(dists, "single") 
dendrogram(linkage_matrix, labels=["0", "1", "2"]) 
plt.title("test") 
plt.show() 

下面是由腳本創建的情節:

dendrogram plot

+0

如果距離矩陣不對稱,我如何得到樹狀圖?任何幫助表示讚賞。 – chandan