scipy.cluster.hierarchy:标签看起来不正确,并且与垂直轴的值混淆

时间:2016-11-20 04:14:54

标签: python-3.x matplotlib scipy linkage dendrogram

我知道scipy.cluster.hierarchy专注于处理距离矩阵。但是现在我有一个相似性矩阵......在我使用树状图绘制它之后,就会发生一些奇怪的事情。 这是代码:

similarityMatrix = np.array(([1,0.75,0.75,0,0,0,0],
                         [0.75,1,1,0.25,0,0,0],
                         [0.75,1,1,0.25,0,0,0],
                         [0,0.25,0.25,1,0.25,0.25,0],
                         [0,0,0,0.25,1,1,0.75],
                         [0,0,0,0.25,1,1,0.75],
                         [0,0,0,0,0.75,0.75,1]))

这是连接方法

Z_sim = sch.linkage(similarityMatrix)
plt.figure(1)
plt.title('similarity')
sch.dendrogram(
    Z_sim,
    labels=['1','2','3','4','5','6','7']
)
plt.show()

但结果如下:

我的问题是:

  1. 为什么这个树状图的标签不对?
  2. 我给出了连接方法的相似度矩阵,但我无法完全理解垂直轴的含义。例如,由于最大相似度为1,为什么垂直轴的最大值几乎为1.6?
  3. 非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

  • linkage期望"距离"而不是"相似性"。要将矩阵转换为距离矩阵,可以从1:

    中减去矩阵
    dist = 1 - similarityMatrix
    
  • linkage不接受方形距离矩阵。它希望距离数据在"condensed" form。你可以使用scipy.spatial.distance.squareform

    来实现
    from scipy.spatial.distance import squareform
    
    dist = 1 - similarityMatrix
    condensed_dist = squareform(dist)
    Z_sim = sch.linkage(condensed_dist)
    

    (当你将形状为(m,n)的二维数组传递给linkage时,它会将行视为n维空间中的点,并在内部计算距离。)

    < / LI>