详解聚类评估

详解聚类评估

估计聚类趋势

这一步骤是检测数据分布中是否存在非随机的簇结构

如果数据是基本随机的,那么聚类的结果也是毫无意义的 。

方法一:观察聚类误差是否随聚类类别数量的增加而单调变化

如果数据是基本随机的,即不存在非随机簇结构。那么聚类误差随聚类类别数量增加而变化的幅度应该较不显著,并且也找不到一个合适的 K 对应数据的真实簇数。

方法二:Hopkins Statistic(霍普金斯统计量)

判断数据在空间上的随机性
在这里插入图片描述
在这里插入图片描述
如果样本接近随机分布 H 的值接近于 0.5

如果聚类趋势明显 H 的值接近于 1

判定数据簇数

K-均值这样的算法需要数据集的簇数作为参数,簇数也可以看作是数据集的有趣并且重要的概括统计量。因此,在使用聚类算法导出详细的簇之前,估计簇数是可取的。

方法一:经验法

在这里插入图片描述

方法二:手肘法

给定k>0,使用像K-均值这样的算法对数据集聚类,并计算簇内方差和var(k)。然后,绘制var关于k的曲线。曲线的第一个(或最显著的)拐点暗示“正确的”簇数。

方法三:交叉验证法

将数据分为m部分;用m-1部分获得聚类模型,余下部分评估聚类质量(测试样本与类中心的距离和);对k>0重复m次,比较总体质量,选择能获得最好聚类质量的k

测定聚类质量

外在方法(有监督方法)

需要基准数据。用一定的度量评判聚类结果与基准数据的符合程度。

(基准是一种理想的聚类,通常由专家构建)

Jaccard Coefficient, JC(Jaccard系数)

在这里插入图片描述 在这里插入图片描述
结果值均在[0,1]区间,值越大越好。

purity(纯度)

在这里插入图片描述
在这里插入图片描述

sklearn 中 Purity 的实现
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metric.compute_purity(labels_pred, labels_true)
Fowlkes and Mallows Index, FMI(FM指数)

在这里插入图片描述
在这里插入图片描述

sklearn中FMI的实现

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>>
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)  
0.47140...

结果值均在[0,1]区间,值越大越好。

Rand Index, RI(兰德系数)

在这里插入图片描述
在这里插入图片描述
( a+b+c+d=m(m-1)/2 )
结果值均在[0,1]区间,值越大越好。

Adjusted Rand index, ARI (调整兰德系数)

在这里插入图片描述
ARI的取值范围 [-1,1] ,值越大意味着聚类结果与真实情况越吻合,广义定义上来说,ARI 衡量的是两个数据分布的吻合程度

sklearn中Adjusted Rand index ,ARI 的实现

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
 
>>> metrics.adjusted_rand_score(labels_true, labels_pred)  
0.24
Normalized Mutual Information, NMI(标准化后的互信息)

在这里插入图片描述MI和NMI 利用互信息的方法来衡量聚类效果,取值范围 [0,1] ,值越大意味着聚类结果与真实情况越吻合,

sklearn 中 Normalized Mutual Information, NMI 的实现
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.normalized_mutual_info_score(labels_true, labels_pred)
Adjusted Mutual Information, AMI(标准化后的互信息)

在这里插入图片描述
AMI 利用互信息的方法来衡量聚类效果,取值范围 [-1,1] ,值越大意味着聚类结果与真实情况越吻合,广义定义上来说,ARI 衡量的是两个数据分布的吻合程度

sklearn 中 Adjusted Mutual Information, AMI 的实现

>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
 
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred) 
Homogeneity, completeness and V-measure

同质性homogeneity:每个群集只包含单个类的成员。

完整性completeness:给定类的所有成员都分配给同一个群集。

两者的调和平均V-measure

sklearn 中Homogeneity, completeness and V-measure 的实现
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
 
>>> metrics.homogeneity_score(labels_true, labels_pred)  
0.66...
 
>>> metrics.completeness_score(labels_true, labels_pred) 
0.42...

>>> metrics.v_measure_score(labels_true, labels_pred)    
0.51...

内在方法 (无监督方法)

无需基准数据。类内聚集程度和类间离散程度

Silhouette Coefficient(轮廓系数)

在这里插入图片描述
α(p)反映的是 p 所属簇中数据的紧凑程度,
b(p) 反映的是该簇与其他临近簇的分离程度 。
显然 , b(p) 越大, α(p) 越小,对应的聚类质量越好,

轮廓系数的取值范围为 [-1,1] ,分数越大越好

sklearn 中 轮廓系数的实现

>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.silhouette_score(X, labels, metric='euclidean')
Calinski-Harabaz Index

Calinski-Harabasz分数值ss的数学计算公式是
在这里插入图片描述
也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。

相比于轮廓系数计算速度非常快啊!

sklearn 中 Calinski-Harabasz Index 的实现

在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score.

>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.calinski_harabaz_score(X, labels)