我不确定我是否理解您为什么要这样做,但是,根据您在上面发布的评论,您似乎想通过比较它们来聚类 10 个对象(“零”、“一”、“九”)混淆矩阵中的值,由其他算法生成。
我希望集群最大化分类结果:如果一个类主要被识别为另一个类,那么两个类都应该融合。
...因此,查看您的数据,对象“八”和对象“九”可能在同一个集群中,因为它们的值大多较低,而“八”列的值相对较高。
为此,您可以将 10 个对象中的每一个视为具有 10 个任意属性;那么这是一个标准设置。也许欧几里得距离适合确定物体之间的距离;你会最清楚。
听起来你想做一些层次聚类,你可以用scipy.cluster.hierarchy
; 下面的例子。
例子
我不想手动输入你的数据,所以我只是随机生成了一个矩阵。为避免混淆,我将对象称为“零”...“九”(拼写出来),并且使用数字“1”到“9”作为对象的属性。
0 1 2 3 4 5 6 7 8 9
zero 0.37 0.27 0.23 0.92 0.86 0.62 0.08 0.95 0.35 0.69
one 0.24 0.23 0.70 0.39 0.52 0.03 0.14 0.00 0.53 0.10
two 0.78 0.12 0.85 0.79 0.32 0.90 0.78 0.07 0.07 0.62
...
nine 0.15 0.39 0.27 0.93 0.12 0.14 0.34 0.11 0.72 0.52
所以这是我的“混淆矩阵”。
使用 SciPy 进行层次聚类。我正在使用欧几里得距离和单链接凝聚法。
from scipy.cluster import hierarchy
Y = hierarchy.distance.pdist(data.as_matrix(), metric='euclidean')
Z = hierarchy.linkage(Y, method='single')
ax = hierarchy.dendrogram(Z, show_contracted=True, labels=data.index.tolist())
[我把我的矩阵放在一个数据框中,这样我就可以给列和索引添加标签。这就是为什么我使用 pandas 命令data.as_matrix()
来获取原始数据并data.index.tolist()
设置标签的原因。]
这给出了: