2017-01-01 45 views
0

我有三个矩阵进行比较。他们每个人都是5x6。我最初想要使用层次聚类来对矩阵进行聚类,以便在给定相似阈值的情况下对最相似的矩阵进行分组。距离矩阵的树形图或其他图

我在python中找不到任何这样的函数,所以我实现了手动距离度量,(p-norm where p=2)。现在我有一个3x3的距离矩阵(我认为这也是这种情况下的相似矩阵)。

我现在试图产生树状图。这是我的代码,这是错的。 I 想要产生显示最相似的矩阵的聚类的图(可能的树形图)。矩阵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() 

这是输出: enter image description here

什么是联动(dist_mat的意思,“单“)?我假设输出图看起来像这样,其中距离为0和1之间的距离为2.0(例如)。 enter image description here

是否有更好的方法来表示这些数据?是否有一个函数可以用几个矩阵代替点,比较和形成距离矩阵,然后聚类?对于如何可视化这些矩阵之间的差异,我愿意接受其他建议。

+0

这似乎是正确的,那就意味着一流的0和2的分组,然后他们两个用1分组高度是距离,并且由于(0,2)的簇具有约〜3.4的距离,所以一切正常。 – JeD

+0

@JeD - 谢谢。是否有一个函数可以用几个矩阵代替点,比较和形成距离矩阵,然后聚类? – amc

回答

1

linkage的第一个参数不应该是平方距离矩阵。它必须是condensed distance matrix。在你的情况下,这将是np.array([2.0, 3.8459253727671276e-16, 2])。如果传递的二维阵列,以linkage具有形状(m, n)可以从距离的平方矩阵转换为使用scipy.spatial.distance.squareform

浓缩形式,它把它作为mn维空间的阵列,并且它计算的距离这些点本身。这就是为什么当你通过平方距离矩阵时你没有得到一个错误 - 但你得到了一个不正确的图。 (这是一个无证的“功能”linkage。)

还要注意,因为3.8e-16的距离太小,所以与点0和2之间的链接相关的水平线可能在plot- - 它在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() 

下面是由脚本创建的情节:

dendrogram plot

+0

如果距离矩阵不对称,我如何得到树状图?任何帮助表示赞赏。 – chandan