[英]How can I add labels to a distance matrix used to make a dendrogram and have the labels also show on the dendrogram
[英]Dendrogram or Other Plot from Distance Matrix
我有三個矩陣可供比較。 每個都是5x6。 我最初想要使用層次聚類來聚類矩陣,以便在給定相似性閾值的情況下對最相似的矩陣進行分組。
我在python中找不到任何這樣的函數,所以我手工實現了距離測量, (p-norm,其中p = 2) 。 現在我有一個3x3距離矩陣(我相信在這種情況下也是一個相似矩陣)。
我現在正在嘗試生成樹狀圖。 這是我的代碼,這就是錯誤的。 我想生成一個圖形(如果可能的話,樹形圖),顯示最相似的矩陣的簇。 矩陣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()
聯系的意義是什么(dist_mat,'single')? 我會假設輸出圖看起來像這樣,其中距離是2.0在0和1之間(例如)。
有更好的方法來表示這些數據嗎? 是否有一個函數可以接受幾個矩陣而不是點,比較並形成距離矩陣,然后聚類? 我對如何可視化這些矩陣之間的差異的其他建議持開放態度。
linkage
的第一個參數不應該是方形距離矩陣。 它必須是壓縮距離矩陣 。 在你的情況下,那將是np.array([2.0, 3.8459253727671276e-16, 2])
。 您可以使用scipy.spatial.distance.squareform
從方形距離矩陣轉換為壓縮形式
如果將二維數組傳遞linkage
形狀(m, n)
,則會將其視為n
維空間中m
個點的數組,並計算這些點本身的距離。 這就是為什么當你通過方形距離矩陣時沒有得到錯誤 - 但是你得到了一個不正確的情節。 (這是一個未記錄的“功能” linkage
。)
另請注意,由於距離3.8e-16太小,與點0和2之間的鏈接相關聯的水平線可能在圖中不可見 - 它位於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()
這是腳本創建的圖:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.