图谱连接

草稿

轮廓系数

在没有参考标签时,用每个点的同簇距离和最近异簇距离来评价聚类。

concept intermediate machine-learningmetricsclustering

问题入口:这次没有答案标签

外部聚类指标会把预测簇和参考标签对比。轮廓系数(Silhouette score)不同:它是一个内部聚类指标。

它只看点的位置、距离和簇分配。它不知道某个点真正属于 graphtree 还是 hash

没有参考标签的聚类几何内部指标查看距离和簇分配,而不是答案标签。
p1p2p3p4p5p6p7p8p9
指标能看到什么

点坐标、距离,以及簇编号 A/B/C

指标看不到什么

graph/tree/hash 这样的参考标签

第一个朴素想法:只看簇内是否靠近

如果一个簇里的点彼此很近,这个簇看起来不错。但这只回答了一半问题。

如果某个点也很靠近另一个簇,它可能在边界上,甚至可能被分错了。

核心发明:同簇距离对最近异簇距离

对一个点 i,定义:

  • a(i)i 到同簇其他点的平均距离。
  • b(i)i 到最近其他簇的平均距离。
一个点提出两个距离问题`a(i)` 是同簇平均距离;`b(i)` 是最近其他簇的平均距离。
p1p2p3p4p5p6p7p8p9
a(i)0.559

到同簇点的平均距离

b(i)4.673

最近其他簇:B

s(i)0.88

(b - a) / max(a, b)

平均轮廓系数0.889

形式化版本

i 的轮廓值是:

s(i)=b(i)a(i)max(a(i),b(i))s(i)=\frac{b(i)-a(i)}{\max(a(i), b(i))}

整个聚类的轮廓系数是所有 s(i) 的平均值。

接近 1 表示点明显更靠近自己的簇。接近 0 表示点在簇之间的边界附近。负数表示最近的其他簇平均上比当前簇更近。

对单点簇,本实现令 s(i)=0,避免把一个孤立点奖励成“完美分离”。

交互实验台

内部聚类指标预设实验台

说明: 三个紧凑组彼此较远,因此簇内紧密和簇间分离是一致的。

轮廓系数0.889

越高越好

Calinski-Harabasz251.312

越高越好

Davies-Bouldin0.126

越低越好

Dunn5.358

越高越好

B_k86.004
W_k1.027
最小间隔4.418
最大直径0.825

静态无 JS 备选:

固定样本的轮廓值
a(i)b(i)s(i)
p1A0.4935.0820.903
p2A0.5594.6730.880
p3A0.6055.2730.885
p4B0.4934.9390.900
p5B0.5595.3380.895
p6B0.6054.7520.873
p7C0.5065.2710.904
p8C0.6365.4150.883
p9C0.6955.4890.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

练习

  1. 为什么轮廓系数同时需要 a(i)b(i)
  2. 接近 0 的分数说明点可能处在什么位置?
  3. 为什么不应该让单点簇自动得到 1 分?

图谱连接 : 轮廓系数