草稿
Rand 指数
用所有无序样本对来判断聚类和参考标签是否在“放一起/分开”这件事上一致。
concept beginner machine-learningmetricsclustering
问题入口:纯度漏掉了拆分错误
固定样本的纯度很高:7/8 = 0.875。但真实的 graph 卡片被分在簇 A 和 B,真实的 tree 卡片也被分在簇 B 和 C。
Rand 指数把问题从“每个簇的多数标签是什么”改成“每一对样本发生了什么”。
第一个朴素想法:继续用簇内多数
簇 B 同时有一个 graph 和一个 tree。纯度会给它 1 分,因为两者并列多数。
但这隐藏了一个成对错误:Cy 和 Di 被放在一起,可它们的参考标签不同。
核心发明:评价样本对是否一致
对每个无序样本对,问两个是/否问题:
- 这两个样本的参考标签相同吗?
- 这两个样本在同一个预测簇里吗?
于是得到成对计数:
TP:同标签,同簇。FP:异标签,同簇。FN:同标签,异簇。TN:异标签,异簇。
两边都放在一起
错误合并
错误拆开
两边都分开
形式化版本
n 个样本的无序样本对数量是:
Rand 指数是成对决策一致的比例:
固定样本中:
交互实验台
聚类指标预设实验台
说明: 一个混合簇和两个被拆开的真实类别会让纯度看起来高,但成对指标会暴露损失。
7/8
23/28
S=3, E=1
pair P=0.75, pair R=0.429
无脚本静态表:
| TP | 3 |
|---|---|
| FP | 1 |
| FN | 4 |
| TN | 20 |
| TOTAL | 28 |
正确性直觉
每一对样本恰好属于 TP、FP、FN、TN 之一。分子 TP + TN 正好数出两个划分在“放一起/分开”上做出同样决定的样本对。
局限:真负例可能太多
类别很多时,大多数样本对可能本来就标签不同。一个聚类即使没有很好找回同标签组,也可能得到很多 TN。
所以下一个节点会调整机会一致性。
Purity: 0.875
RI: 0.821
ARI: 0.444
FMI: 0.567
Purity: 1
RI: 1
ARI: 1
FMI: 1
Purity: 1
RI: 0.75
ARI: 0
FMI: 不可用
Purity: 0.375
RI: 0.25
ARI: 0
FMI: 0.5
实现草图
function randIndex(items: { label: string; cluster: string }[]) {
let tp = 0, fp = 0, fn = 0, tn = 0;
for (let i = 0; i < items.length; i += 1) {
for (let j = i + 1; j < items.length; j += 1) {
const sameLabel = items[i].label === items[j].label;
const sameCluster = items[i].cluster === items[j].cluster;
if (sameLabel && sameCluster) tp += 1;
else if (!sameLabel && sameCluster) fp += 1;
else if (sameLabel && !sameCluster) fn += 1;
else tn += 1;
}
}
const total = tp + fp + fn + tn;
return total === 0 ? null : (tp + tn) / total;
}
复杂度
直接枚举样本对是 O(n^2) 时间,额外计数空间是 O(1)。如果已经有列联表,也可以用组合数从表格中计算。
常见误区
- Rand 指数里的
TP/FP/FN/TN是样本对计数,不是单个分类样本。 TN表示“两边都分开”,不是“这个样本是负类”。- 高 RI 仍然可能需要机会调整。
练习
- 固定样本中唯一的
FP是哪一对? - 为什么有四个
FN样本对? - 为什么 RI 使用
TN,而 FMI 不使用?
图谱连接 : Rand 指数