python环境
聚类性能度量
外部指标
聚类结果与某个参考模型进行比较
首先,先定义计算用到的数据集。对于数据集D={x1,x2,...,xn},假定通过聚类得出的聚类结果为C={c1,c2,...ck} ,每一类的类别标签为λ;参考模型的聚类结果为C∗={c1∗,c2∗,...,cs∗},类别标签为λ∗。
定义四个集合:
a=∣SS∣,SS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
b=∣SD∣,SD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
c=∣DS∣,DS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
d=∣DD∣,DD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
也就是说随便从数据集中拿出两个样本来,那么这两个样本要么在同一类,要么不同类,只有这两种情况。那么在两个模型下,就会产生上面的那四种集合。且a+b+c+d=n*(n-1)/2,即无向完全图边的数目。
Jaccard系数
JC=a+b+cb+c
上述公式是python3.7中实现的公式,表明两个集合的不相似度。
import scipy.spatial.distance as dist
a=[1,0,1]
b=[0,1,1]
print(dist.jaccard(a,b))
FM指数
FMI=a+ba⋅a+ca
表示两个集合的相似度
取值[0,1],越接近1相似度越大
from sklearn.metrics.cluster import fowlkes_mallows_score
fowlkes_mallows_score([2, 2, 1, 1], [1, 1, 2, 2])
fowlkes_mallows_score([2, 2, 2, 1], [1, 1, 2, 2])
内部指标
直接进行聚类评估,不利用任何参考模型
同样先定义一些函数:
- 类C内样本间的平均距离:avg(C)=∣C∣(∣C∣−1)2∑1≤i<j≤∣C∣dist(xi,xj)
- 类内最远距离:diam(C)=max1≤i<j≤∣C∣dist(xi,xj)
- 两类的最近样本间距离:dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj)
- 两类中心点的距离:dcen(Ci,Cj)=dist(μi,μj)
DB指数
DBI=k1i=1∑kmaxj=i(dcen(μi,μj)avg(Ci)+avg(Cj))
当聚类中心未给出时,DB指数可以评估模型聚类的优劣。DB指数反映了类间相似度,所以DBI越接近0,说明聚类效果越好
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import davies_bouldin_score
iris = datasets.load_iris()
X = iris.data
kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans.labels_
davies_bouldin_score(X, labels)
Dunn指数
DI=min1≤i≤k{minj=i(max1≤l≤kdiam(Cl)dmin(Ci,Cj))}
python中没有现成的DI代码,需要自己造轮子
DI代表了类间的距离关系,值越大越好。
参考资料
[1] : https://scikit-learn.org/stable/modules/classes.html?highlight=ri#module-sklearn.metrics
[2] : 周志华 机器学习 西瓜书