繁体   English   中英

树形图或距离矩阵的其他图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM