草稿
轮廓系数
在没有参考标签时,用每个点的同簇距离和最近异簇距离来评价聚类。
concept intermediate machine-learningmetricsclustering
问题入口:这次没有答案标签
外部聚类指标会把预测簇和参考标签对比。轮廓系数(Silhouette score)不同:它是一个内部聚类指标。
它只看点的位置、距离和簇分配。它不知道某个点真正属于 graph、tree 还是 hash。
点坐标、距离,以及簇编号 A/B/C
graph/tree/hash 这样的参考标签
第一个朴素想法:只看簇内是否靠近
如果一个簇里的点彼此很近,这个簇看起来不错。但这只回答了一半问题。
如果某个点也很靠近另一个簇,它可能在边界上,甚至可能被分错了。
核心发明:同簇距离对最近异簇距离
对一个点 i,定义:
a(i):i到同簇其他点的平均距离。b(i):i到最近其他簇的平均距离。
到同簇点的平均距离
最近其他簇:B
(b - a) / max(a, b)
形式化版本
点 i 的轮廓值是:
整个聚类的轮廓系数是所有 s(i) 的平均值。
接近 1 表示点明显更靠近自己的簇。接近 0 表示点在簇之间的边界附近。负数表示最近的其他簇平均上比当前簇更近。
对单点簇,本实现令 s(i)=0,避免把一个孤立点奖励成“完美分离”。
交互实验台
内部聚类指标预设实验台
说明: 三个紧凑组彼此较远,因此簇内紧密和簇间分离是一致的。
越高越好
越高越好
越低越好
越高越好
静态无 JS 备选:
| 点 | 簇 | a(i) | b(i) | s(i) |
|---|---|---|---|---|
| p1 | A | 0.493 | 5.082 | 0.903 |
| p2 | A | 0.559 | 4.673 | 0.880 |
| p3 | A | 0.605 | 5.273 | 0.885 |
| p4 | B | 0.493 | 4.939 | 0.900 |
| p5 | B | 0.559 | 5.338 | 0.895 |
| p6 | B | 0.605 | 4.752 | 0.873 |
| p7 | C | 0.506 | 5.271 | 0.904 |
| p8 | C | 0.636 | 5.415 | 0.883 |
| p9 | C | 0.695 | 5.489 | 0.873 |
实现草图
function silhouettePoint(a: number, b: number) {
const denominator = Math.max(a, b);
return denominator === 0 ? 0 : (b - a) / denominator;
}
复杂度
直接实现通常需要成对距离,因此对 n 个点是 O(n^2) 时间。除非缓存完整距离矩阵,否则额外空间主要是摘要和点级分数。
常见误区
- 轮廓系数是内部指标:它不使用参考标签。
- 越高越好,但它仍然依赖距离定义。
- 点级分数为负,通常是在提醒“另一个簇平均上更近”。
1. 轮廓系数
silhouette-score
2. Calinski-Harabasz
calinski-harabasz-index
3. Davies-Bouldin
davies-bouldin-index
4. Dunn
dunn-index
练习
- 为什么轮廓系数同时需要
a(i)和b(i)? - 接近
0的分数说明点可能处在什么位置? - 为什么不应该让单点簇自动得到
1分?
图谱连接 : 轮廓系数