混淆矩阵与python的分层聚类

时间:2013-09-12 17:06:29

标签: python scipy cluster-analysis hierarchical hierarchical-clustering

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

enter image description here

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

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

但我得错了结果。

我应该如何组织数据才能应用群集?

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

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

1 个答案:

答案 0 :(得分:3)

我不确定我理解为什么你这样做,但是,基于你上面发表的评论,你似乎想要聚集10个对象('零','一''九')通过比较混淆矩阵中的值,由其他算法生成。

  

我希望群集能够最大化分类结果:if   一个类主要被认为是另一个类,然后两个类都应该   融合。

...因此,查看您的数据,对象'8'和对象'9'可能位于同一个群集中,因为它们都具有大多数低值和一个相对较高的“八”列值。

为此,您可以将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

所以这是我的“混淆矩阵”。

Confusion Matrix

使用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()设置标签。]

这给出了:

Dendrogram