聚类评价指标
最近在做聚类的项目,聚类得到结果后我们需要知道聚类的好坏,用哪个算法效果比较好。肯定要选择那个最好评价的算法。今天我们就不谈算法只谈算法结果的评价。
我也从网上看了很多的别人写的东西,总之是五花八门的。那下面我们言归正传。
聚类算法是机器学习算法中的一种无监督算法。那么在生活中我们大多数做项目的话其实数据集都是为标定的。我看到许多人有写到通过有label的样本,计算它的混淆矩阵。这不乏是一种办法,那么今天说的方法其实是一种内部方法,就是说通过聚类后的结果label来计算的一种评价指标。
内部有效性指标呢设计的时候从三个方面来看聚类的有效性:
- 度量各个聚类的分离程度,理论上,类分离程度越大,结果越好。
- 度量每个类内的内在紧致性,紧致性越大,聚类效果越好。
- 度量各个类表示的复杂度,在可行的类表示中选择简单的。
Silhouette
首先,我们先看评价指标的其中一个指标 :轮廓系数。
Silhouette 遵循类紧致性。Silhouette值用来描述一个目标对于目标所在簇与其他簇之间的相似性。其范围是从-1~+1,这个值越大表明目标与自己所在簇之间的匹配关系度越高,与其他簇的匹配关系度越低。如果这个值越高,那么聚类结果越好,如果是很小或是负值,那么可能是分簇太多或是太少造成的。
Silhouette是通过一些距离矩阵来计算的。
Silhouette的定义
假设数据集我们已经通过聚类算法分成了很多类。对于目标
i
i
i有
i
∈
C
i
i\in C_i
i∈Ci,得到
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)=∣Ci−1∣1j∈Ci,i=j∑d(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
i∈Ci,
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=imin∣Ck∣1j∈Ck∑d(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),if∣Ci∣>1
and
s
(
i
)
=
0
,
i
f
∣
C
i
∣
=
1
s(i)=0,if \left | C_i \right |=1
s(i)=0,if∣Ci∣=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)=⎩⎨⎧1−a(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
−1≤s(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)