我使用的是 https:/www.mathworks.commatlabcentralfileexchange32197-clustering-results-measurement 用于评估我在MATLAB中的聚类准确性,它提供了 准确度 和 rand_index但当我试着使用时,我发现它的性能和预期一样正常。但是,当我尝试使用 NMI 作为衡量标准,聚类性能极低,我在使用源码(https:/www.mathworks.commatlabcentralfileexchange29047-normalized-mutual-information).
其实我有两个Nx1向量作为输入,一个是实际的标签,另一个是标签分配。我基本上检查了每一个元素的内部,我发现即使我有82%的rand_index,NMI也只有0.3209。以下是Iris Dataset的例子 https:/archive.ics.uci.edumldatasetsiris。 与MATLAB内置K-Means。
data = iris(:,1:data_dim);
k = 3;
[result_label,centroid] = kmeans(data,k,'MaxIter',10000);
actual_label = iris(:,end);
NMI = nmi(actual_label,result_label);
[Acc,rand_index,match] = AccMeasure(actual_label',result_label');
的结果。
Auto ACC: 0.820000
Rand_Index: 0.701818
NMI: 0.320912
Rand Index会随着数据点数量的增加而趋向于1(即使在比较随机聚类时也是如此),所以当你有一个大数据集时,你永远不会真正期望看到Rand的小值。
同时,当你的所有点都落入同一个大聚类时,Accuracy也会很高。
我有一种感觉,NMI产生的比较更可靠。 为了验证,可以尝试运行一个维度还原,并根据两种聚类绘制带颜色的数据点。 可视化统计往往是培养对数据直觉的最好方法。
如果你想探索更多,一个方便的聚类比较的python包是 CluSim.