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

Posted

技术标签:

【中文标题】使用python从混淆矩阵进行层次聚类【英文标题】:Hierarchical clustering from confusion matrix with python 【发布时间】:2013-09-17 04:46:23 【问题描述】:

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

我尝试修改代码:

conf_mat = 1 - conf_mat   # 1.0 means dissimilarity
sch.linkage(conf_mat, method='warp')

但我得到了错误的结果。

我应该如何组织我的数据以应用聚类?

下面应该给我重新排列的集群顺序,对吧?

ind = sch.fcluster(Y, 0, 'distance')

【问题讨论】:

基于距离的算法通常会期望一个 对称 距离,我猜 - 每个对象到自身的距离是 0。meaning 做什么您希望集群拥有吗? 确实这里的重点是将混淆数据转换为度量标准。我希望集群最大化分类结果:如果一个类主要被识别为另一个类,那么两个类都应该融合。 【参考方案1】:

我不确定我理解您为什么要这样做,但是根据您在上面发布的评论,您似乎想要对 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() 来设置标签。]

这给出了:

【讨论】:

以上是关于使用python从混淆矩阵进行层次聚类的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中聚类的混淆矩阵

Python使用pandas_ml输出混淆矩阵以及从混淆矩阵衍生出来的其他指标:TPTNFPFNTPRTNR(SPC)PPVNPVFPRFDRFNRACCF1MCC等

如何从 Python 中的混淆矩阵中获取精度、召回率和 f 度量 [重复]

如何绘制 K-mean 算法的混淆/相似矩阵

Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战

从混淆矩阵计算真正值以进行多类分类