聚类评价指标

最近在做聚类的项目,聚类得到结果后我们需要知道聚类的好坏,用哪个算法效果比较好。肯定要选择那个最好评价的算法。今天我们就不谈算法只谈算法结果的评价。
我也从网上看了很多的别人写的东西,总之是五花八门的。那下面我们言归正传。
聚类算法是机器学习算法中的一种无监督算法。那么在生活中我们大多数做项目的话其实数据集都是为标定的。我看到许多人有写到通过有label的样本,计算它的混淆矩阵。这不乏是一种办法,那么今天说的方法其实是一种内部方法,就是说通过聚类后的结果label来计算的一种评价指标。
内部有效性指标呢设计的时候从三个方面来看聚类的有效性:

  1. 度量各个聚类的分离程度,理论上,类分离程度越大,结果越好。
  2. 度量每个类内的内在紧致性,紧致性越大,聚类效果越好。
  3. 度量各个类表示的复杂度,在可行的类表示中选择简单的。

Silhouette

首先,我们先看评价指标的其中一个指标 :轮廓系数。
Silhouette 遵循类紧致性。Silhouette值用来描述一个目标对于目标所在簇与其他簇之间的相似性。其范围是从-1~+1,这个值越大表明目标与自己所在簇之间的匹配关系度越高,与其他簇的匹配关系度越低。如果这个值越高,那么聚类结果越好,如果是很小或是负值,那么可能是分簇太多或是太少造成的。
Silhouette是通过一些距离矩阵来计算的。

Silhouette的定义

假设数据集我们已经通过聚类算法分成了很多类。对于目标 i i i i ∈ C i i\in C_i iCi,得到
a ( i ) = 1 ∣ C i − 1 ∣ ∑ j ∈ C i , i ≠ j d ( i , j ) a(i) = \frac{1}{\left | C_i -1 \right|}\sum_{j\in C_i,i\neq j}d(i,j) a(i)=Ci11jCi,i=jd(i,j)表示i与同簇之间其他目标的平均距离。
这里的 d ( i , j ) d(i,j) d(i,j)是目标i和j在簇 C i C_i Ci中的距离。那么 a ( i ) a(i) a(i)可以说成是i被分配到这个簇的好坏程度。
那么下面我们就来讨论不同簇的不相似程度。
对于目标 i i i i ∈ C i i\in C_i iCi, C k C_k Ck表示第K个簇,
b ( i ) = min ⁡ k ≠ i 1 ∣ C k ∣ ∑ j ∈ C k d ( i , j ) b(i) = \min_{k\neq i}\frac{1}{\left | C_k \right|}\sum_{j\in C_k}d(i,j) b(i)=k=iminCk1jCkd(i,j)表示i到除 C i C_i Ci簇外其他簇 C k C_k Ck中的点之间的平均距离作为簇之间的平均不相似度。我们用i到其它簇的最小平均距离表示b(i)。

下面我们来定义目标值i的Silhouette值。
s ( i ) = b ( i ) − a ( i ) max ⁡ ( a ( i ) , b ( i ) ) , i f ∣ C i ∣ > 1 s(i) = \frac{b(i)-a(i)}{\max(a(i),b(i))},if\left | C_i \right |>1 s(i)=max(a(i),b(i))b(i)a(i),ifCi>1
and
s ( i ) = 0 , i f ∣ C i ∣ = 1 s(i)=0,if \left | C_i \right |=1 s(i)=0,ifCi=1
我们也可以写成
s ( i ) = { 1 − a ( i ) / b ( i ) , i f a ( i ) < b ( i ) 0 , i f a ( i ) = b ( i ) b ( i ) / a ( i ) − 1 , i f a ( i ) > b ( i ) s(i) = \left\{\begin{matrix} 1- a(i)/b(i),&if a(i)<b(i) \\ 0, &if a(i) = b(i) \\ b(i)/a(i) -1,&if a(i)>b(i) \end{matrix}\right. s(i)=1a(i)/b(i),0,b(i)/a(i)1,ifa(i)<b(i)ifa(i)=b(i)ifa(i)>b(i)
从以上定义我么你可以看到 − 1 ≤ s ( i ) ≤ 1 -1 \leq s(i) \leq 1 1s(i)1
a ( i ) ≪ b ( i ) a(i)\ll b(i) a(i)b(i)的时候,那么 s ( i ) s(i) s(i)就越接近于1,对于簇中值i来说a(i)越小,那么i被分配到这个簇是很合理的。而b(i)的值比较大的时候从邻近簇来说i被分配到现在所在簇的结果不是合理的。因此当s(i)的值接近于1的时候说明配分配到所在簇是极其合理的。当s(i)接近与-1的时候说明,目标i更应该被分配到邻近簇。当s(i)接近与0的时候说明他应该在俩个簇的边界点上。

Silhouette coefficient

silhouette coefficient表示在整个数据集上s(i)的均值的最大值。可得到
S C = max ⁡ k s ˉ ( k ) SC = \max_{k}\bar{s}(k) SC=kmaxsˉ(k)

轮廓系数的应用

在sklearn包中已经有用python实现的轮廓系数值的计算。下面我们来看一下吧。

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd
import matplotlib.pyplot as plt


data = pd.DataFrame([[12,45],[13,44.5],[18,222],[19,223],[12.33,32],[14,50]],columns=list('ab'))
km = KMeans(2)
pre = km.fit_predict(data)
SC = silhouette_score(data,pre)
print(SC)
color_dic = {0:'red',1:'blue',3:'black'}
colors = [color_dic[i] for i in pre]
plt.scatter(data.loc[:,'a'],data.loc[:,'b'],c=colors,alpha=0.7)
plt.show()

参考文献:
[1] 于剑 机器学习从公理到算法
[2] https://en.wikipedia.org/wiki/Silhouette_(clustering)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐