这是一个较长的示例,一个真正的混淆矩阵,具有 10 个输入类别“0”-“9”(手写数字)和 10 个标记为 A-J 的输出簇。
Confusion matrix for 5620 optdigits:
True 0 - 9 down, clusters A - J across
-----------------------------------------------------
A B C D E F G H I J
-----------------------------------------------------
0: 2 4 1 546 1
1: 71 249 11 1 6 228 5
2: 13 5 64 1 13 1 460
3: 29 2 507 20 5 9
4: 33 483 4 38 5 3 2
5: 1 1 2 58 3 480 13
6: 2 1 2 294 1 1 257
7: 1 5 1 546 6 7
8: 415 15 2 5 3 12 13 87 2
9: 46 72 2 357 35 1 47 2
----------------------------------------------------
580 383 496 1002 307 670 549 557 810 266 estimates in each cluster
y class sizes: [554 571 557 572 568 558 558 566 554 562]
kmeans cluster sizes: [ 580 383 496 1002 307 670 549 557 810 266]
例如,簇A有580个数据点,其中415个是“8”;簇 B 有 383 个数据点,其中 249 个是“1”;等等。
问题是输出类被打乱、排列;它们按此顺序对应,计数:
A B C D E F G H I J
8 1 4 3 6 7 0 5 2 6
415 249 483 507 294 546 546 480 460 257
可以说“成功率”是 75 % = (415 + 249 + 483 + 507 + 294 + 546 + 546 + 480 + 460 + 257) / 5620但这
会丢掉有用的信息——在这里,E 和 J说“6”,没有集群说“9”。
因此,将混淆矩阵每一列中最大的数字相加,然后除以总数。
但是,如何计算重叠/缺失的簇,比如 2 个“6”,这里没有“9”?
我不知道一种普遍认可的方式(怀疑匈牙利算法
是否在实践中使用)。
底线:不要丢弃信息;查看整个混淆矩阵。
NB这样的“成功率”会看好新数据!
通常将数据分成 2/3 的“训练集”和 1/3 的“测试集”,仅在 2/3 上训练例如 k-means,
然后在测试集上测量混淆/成功率——通常比仅在训练集上。
可以说的更多;参见例如
交叉验证。