赞
踩
受算法选择、算法参数设置、算法随机性等影响,聚类有效性会出现差异。
概括地说,评估聚类的方法主要有两种:
实际生产环境中,很少有标注数据帮助我们进行聚类,因为很难人为地确定到底有多少个簇,簇之间的区别不是很明显,特别是对于文本数据。
内部评估方法有:
紧密度(Compactness):每个聚类簇中的样本点到聚类中心的平均距离。对应聚类结果,需要使用所有簇的紧密度的平均值来衡量聚类算法和聚类各参数选取的优劣。紧密度越小,表示簇内的样本点月集中,样本点之间聚类越短,也就是说簇内相似度越高。
分割度(Seperation):是个簇的簇心之间的平均距离。分割度值越大说明簇间间隔越远,分类效果越好,即簇间相似度越低。
戴维森堡丁指数(Davies-bouldin Index,DBI):该指标用来衡量任意两个簇的簇内距离之后与簇间距离之比。该指标越小表示簇内距离越小,簇内相似度越高,簇间距离越大,簇间相似度低。
邓恩指数(Dunn Validity Index,DVI):任意两个簇的样本点的最短距离与任意簇中样本点的最大距离之商。该值越大,聚类效果越好。
轮廓系数 (Silhouette Coefficient):对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是[-1,1],同类别样本距离越相近不同类别样本距离越远,分数越高。
当样本的真实标签未知时,聚类有效性可以通过内部评价指标进行评估。
聚类内部评价指标通过计算聚类结果的类内样本紧密程度或类间样本疏远程度来评价聚类结果优劣。
轮廓系数(Silhouette Coefficient)适用于实际类别信息未知的情况。对于单个样本,设
a
a
a 是与它同类别中其他样本的平均距离,
b
b
b 是与它距离最近不同类别中样本的平均距离,轮廓系数为:
s
=
b
−
a
m
a
x
(
a
,
b
)
s=\frac{b-a}{max(a,b)}
s=max(a,b)b−a
Silhouette Coefficient 对于一个样本点需要计算两种距离:
a
a
a 当前样本点与同类的其他样本点的平均距离,
b
b
b 当前样本点与最接近的另一个类的其他样本点的平均距离,当前样本点的得分是
s
s
s。
s s s 衡量的是当前样本点是否离当前类的其他样本点近,并且与最接近的另一个类足够远。对于每个样本点都需要计算这样一个得分,计算复杂度可想而知。
对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是 [-1, 1] ,同类别样本越距离相近,且不同类别样本距离越远,分数越高。
缺点:
每种评估方法都各有优缺点,因为 Silhouette Coefficient 的计算复杂度太高,即使在 GPU 的机器上,跑 30w 数据跑了1个小时还没跑出来,所以考虑 Calinski-Harbasz Score,Calinski-Harbasz Score 的优点就在于计算速度非常快。
此函数返回所有样本的平均轮廓系数。要获取每个样本的值,请使用silhouette_samples
>>> 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')
...
0.55...
sklearn.metrics.silhouette_score(X, labels, metric='euclidean', sample_size=None, random_state=None)
参数 | X:数组[n_samples_a,n_samples_a](如果metric ==“ precomputed”),否则为[n_samples_a,n_features] 样本之间的成对距离数组或特征数组。 |
labels:数组,形状= [n_samples] 每个样品的预测标签。 | |
metric : 计算要素阵列中实例之间的距离时使用的度量。默认是euclidean(欧氏距离)。 如果metric是字符串,则必须是允许的选项之一metrics.pairwise.pairwise_distances。如果X是距离数组本身,请使用metric="precomputed"。 | |
maxlength | 平均轮廓系数 |
此函数返回所有样本的轮廓系数。
sklearn.metrics.silhouette_samples(X, labels, etric='euclidean')
参数 | X:数组[n_samples_a,n_samples_a](如果metric ==“ precomputed”),否则为[n_samples_a,n_features] 样本之间的成对距离数组或特征数组。 |
labels:数组,形状= [n_samples] 每个样品的预测标签。 | |
metric : 计算要素阵列中实例之间的距离时使用的度量。默认是euclidean(欧氏距离)。 如果metric是字符串,则必须是允许的选项之一metrics.pairwise.pairwise_distances。如果 X 是距离数组本身,请使用metric="precomputed"。 | |
return | 每个样本的轮廓系数 |
这个计算简单直接,得到的 Calinski-Harabasz 分数值 s s s 越大则聚类效果越好。Calinski-Harabasz 分数值 s s s 的数学计算公式是:
s
=
S
S
B
k
−
1
/
S
S
W
N
−
k
=
t
r
(
B
k
)
t
r
(
W
k
)
×
n
E
−
k
k
−
1
s=\frac{SS_B}{k-1}/\frac{SS_W}{N-k}=\frac{tr(B_k)}{tr(W_k)}\times \frac{n_E-k}{k-1}
s=k−1SSB/N−kSSW=tr(Wk)tr(Bk)×k−1nE−k
其中,
n
E
n_E
nE 为训练样本数,
k
k
k为类别数。
B
k
B_k
Bk 为类别之间的协方差矩阵,
W
k
W_k
Wk为内部数据的协方差矩阵,
t
r
tr
tr 为矩阵的迹。
也就是说,类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。
在实际使用的过程中,发现类别越少,Calinski-Harbasz Score的分数越高,当 k=2 时,分数达到最高。但是30w数据分成2类也太敷衍了吧(抓狂)!于是开始研究这个 metrics 到底在评估什么东西。结论,当上述情况发生的时候,需要一个个 K 值去测试,找到一个local maxium(局部最高)的分数,这个分数对应的K值就是当前最佳的分类。根据:Calinski-Harabasz Index and Boostrap Evaluation with Clustering Methods
详细链接:Calinski-Harbasz Score详细资料链接
在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)
560.39...
戴维森堡丁指数(Davies-Bouldin index,DBI) ,又称为分类适确性指标,是由 大卫L·戴维斯 和 唐纳德·Bouldin 提出的一种评估聚类算法优劣的指标。
综合考虑了类内样本相似度以及类间样本差异度 ,其值越小表征聚类有效性越高 ,假设我们有
m
m
m 个序列,将这些序列通过算法聚为
n
n
n 类,使用 DBI 聚类效果评价方法。具体定义如下:
D
B
I
=
1
N
∑
i
=
1
N
max
j
≠
i
S
i
‾
+
S
j
‾
∥
w
i
−
w
j
∥
2
DBI=\frac{1}{N}\sum^N_{i=1}\displaystyle \max_{j\neq i}\frac{\overline{S_i}+\overline{S_j}}{\left\| w_i-w_j\right\|_2}
DBI=N1i=1∑Nj=imax∥wi−wj∥2Si+Sj
式中: D B I DBI DBI 表示 DBI 指标值; S i ‾ \overline{S_i} Si 为第 i i i 类样本到其类中心的平均欧氏距离; ∥ w i − w j ∥ 2 \left\| w_i-w_j\right\|_2 ∥wi−wj∥2为第 i i i 和第 j j j 类的类中心欧氏距离。
分类个数的不同可以导致不同的值,DBI 值越小,分类效果越好(说明分散程度越低)。
详细链接:聚类算法评价指标:DBI指数(Davies-Bouldin)及Python实现
外部评估方法有:
兰德系数(Rand index,RI)需要给定实际类别信息 C,假设 K 是聚类结果
RI 取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。
对于随机结果,RI并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index, ARI)被提出,它具有更高的区分度:
调整兰德系数(Adjusted rand index) ARI 取值范围为[-1,1],值越大意味着聚类结果与真实情况越吻合。从广义的角度来讲,ARI 衡量的是两个数据分布的吻合程度。
优点:
对任意数量的聚类中心和样本数,随机聚类的 ARI 都非常接近于 0;
取值在 [-1, 1] 之间,负数代表结果不好,越接近于 1 越好;
可用于聚类算法之间的比较。
缺点:
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
互信息评分(Mutual Information based scores)与调整互信息( Adjusted mutual information):
利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI 取值范围为[0,1],AMI 取值范围为[-1,1],它们都是值越大意味着聚类结果与真实情况越吻合。
优点:除取值范围在[0,1]之间,其他同 ARI,可用于聚类模型选择;
缺点:需要先验知识。(看sklearn上的例子,貌似需要输入已知标签和预测标签,这就有点麻烦了。)
Two different normalized versions of this measure are available, Normalized Mutual Information(NMI) and Adjusted Mutual Information(AMI). NMI is often used in the literature while AMI was proposed more recently and is normalized against chance:
>>> 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)
0.22504
同质性homogeneity:每个群集只包含单个类的成员。
完整性completeness:给定类的所有成员都分配给同一个群集。
>>> 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...
两者的调和平均V-measure:
>>> metrics.v_measure_score(labels_true, labels_pred)
0.51...
The Fowlkes-Mallows score FMI is defined as the geometric mean of the pairwise precision and recall:
F
M
I
=
T
P
(
T
P
+
F
P
)
(
T
P
+
F
N
)
FMI = \frac{TP}{\sqrt{(TP+FP)(TP+FN)}}
FMI=(TP+FP)(TP+FN)
TP
>>> 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...
个人比较偏好的三个指标有:Calinski-Harabaz Index(未知真实index的模型评估)、Homogeneity, completeness and V-measure(聚类数量情况)、轮廓系数。
[1] 考虑双尺度相似性的负荷曲线集成谱聚类算法 2020.11
[2] Calinski-Harbasz Score 详解 2022.1
[3] 机器学习中评价指标的选择 2018.4
[4] 聚类算法评价指标——Davies-Bouldin指数(Dbi) 2018.5
[5] 聚类︱python实现 六大 分群质量评估指标(兰德系数、互信息、轮廓系数) 2017.4
[6] 聚类评价指标sklearn.metrics.calinski_harabasz_score 2022.8
聚类效果的外部评价指标——纯度(Purity)及其Python和matlab实现 2020.12
聚类分析的评价指标(性能度量) 2020.10
sklearn聚类算法评估方法 之各种系数 2017.11
机器学习评价指标大汇总 2016.4
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。