以下是一个较长的例子,是由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这样的“成功率”对于新数据来说将是乐观的!
习惯上将数据分成3分之2的“训练集”和3分之1的“测试集”,
仅在2/3上训练k-means,
然后在测试集上测量混淆/成功率-通常比仅在训练集上更差。
还可以说得更多;请参见例如
交叉验证。