详解聚类评估
详解聚类评估
- 详解聚类评估
- 估计聚类趋势
- 判定数据簇数
- 测定聚类质量
详解聚类评估
估计聚类趋势
这一步骤是检测数据分布中是否存在非随机的簇结构 。
如果数据是基本随机的,那么聚类的结果也是毫无意义的 。
方法一:观察聚类误差是否随聚类类别数量的增加而单调变化
如果数据是基本随机的,即不存在非随机簇结构。那么聚类误差随聚类类别数量增加而变化的幅度应该较不显著,并且也找不到一个合适的 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)