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

Posted

技术标签:

【中文标题】距离矩阵的树状图或其他图【英文标题】:Dendrogram or Other Plot from Distance Matrix 【发布时间】:2017-05-15 22:49:08 【问题描述】:

我要比较三个矩阵。他们每个人都是5x6。我最初想使用层次聚类来对矩阵进行聚类,以便对最相似的矩阵进行分组,给定相似度阈值。

我在 python 中找不到任何这样的函数,所以我手动实现了距离测量,(p-norm where 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()

这是输出:

linkage(dist_mat, 'single') 是什么意思?我会假设输出图看起来像这样,0 和 1 之间的距离是 2.0(例如)。

有没有更好的方法来表示这些数据?是否有一个函数可以接收多个矩阵而不是点,来比较并形成一个距离矩阵,然后进行聚类?我对如何可视化这些矩阵之间的差异的其他建议持开放态度。

【问题讨论】:

这似乎是对的,意思是先把0和2类分组,然后把它们都和1分组。高度就是距离,由于(0,2)的簇有距离约为 3.4 一切正常 @JeD - 谢谢。有没有一个函数可以接受几个矩阵而不是点,比较并形成一个距离矩阵,然后聚类? 【参考方案1】:

linkage 的第一个参数不应该是平方距离矩阵。它必须是condensed distance matrix。在你的情况下,那将是np.array([2.0, 3.8459253727671276e-16, 2])。您可以使用scipy.spatial.distance.squareform将平方距离矩阵转换为压缩形式

如果您将二维数组传递给linkage,形状为(m, n),它会将其视为m 点在n 维空间中的数组,并自行计算这些点的距离。这就是为什么当您传入平方距离矩阵时没有收到错误的原因——但是您得到了一个不正确的图。 (这是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()

这是脚本创建的情节:

【讨论】:

如果距离矩阵不对称,我如何获得树状图?任何帮助表示赞赏。 @Warren..我在这里有一个疑问..如果我们像镜像一样绘制上面的图会有什么不同吗?即先绘制 0,2 然后 (0,2)->1 都表示相同?

以上是关于距离矩阵的树状图或其他图的主要内容,如果未能解决你的问题,请参考以下文章

使用凝聚算法绘制树状图

如何给 sns.clustermap 一个预先计算的距离矩阵?

在同一个图上一起绘制两个距离矩阵?

如何基于 echarts 在柱状图或条形图上实现转换率?(有想法吗?)

如何基于 echarts 在柱状图或条形图上实现转换率?(有想法吗?)

在距离高度从 SciPy 切割树状图/聚类树