使用Python从混淆矩阵进行层次聚类

Eri*_*ric 4 python cluster-analysis hierarchical-clustering hierarchical scipy

使用以下答案,我尝试根据混淆矩阵编码分层类聚类。混淆矩阵用于评估分类问题的结果,并且不对称。每行代表实际类中的实例。这是一个混淆矩阵的示例,您可以在其中看到“零”类的 25% 的样本被预测为“六”类。

在此输入图像描述

我尝试用以下方法修改代码:

conf_mat = 1 - conf_mat   # 1.0 means dissimilarity
sch.linkage(conf_mat, method='warp')
Run Code Online (Sandbox Code Playgroud)

但我得到了错误的结果。

我应该如何组织数据才能应用聚类?

下面应该给出簇的重新排列顺序,对吧?

ind = sch.fcluster(Y, 0, 'distance')
Run Code Online (Sandbox Code Playgroud)

Ama*_*man 5

我不确定我明白你为什么这样做,但是,根据你上面发布的评论,你似乎想通过比较 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
Run Code Online (Sandbox Code Playgroud)

这就是我的“混淆矩阵”。

混淆矩阵

使用 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())
Run Code Online (Sandbox Code Playgroud)

[我将矩阵放入数据框中,以便可以向列和索引添加标签。这就是为什么我使用 pandas 命令data.as_matrix()来获取原始数据并data.index.tolist()设置标签。]

这给出:

树状图