我有三个矩阵要比较。每个都是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()这是输出:

链接的含义是什么(dist_mat,'single')?我会假设输出图如下所示,其中0到1之间的距离为2.0 (例如)。

是否有更好的方法来表示这些数据?是否有一个函数可以接受几个矩阵而不是点,来比较和形成一个距离矩阵,然后进行聚类?对于如何可视化这些矩阵之间的差异,我愿意听取其他建议。
发布于 2017-01-01 19:17:47
linkage的第一个参数不应该是平方距离矩阵。一定是 distance matrix。在您的例子中,这将是np.array([2.0, 3.8459253727671276e-16, 2])。您可以使用scipy.spatial.distance.squareform从平方距离矩阵转换为浓缩形式。
如果将一个二维数组传递给形状为linkage的(m, n),它将其视为n-dimensional空间中的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()下面是脚本创建的情节:

https://stackoverflow.com/questions/41416498
复制相似问题