聚类算法的性能度量方法
文章目录
聚类算法性能度量
该博客是基于python的机器学习包sklearn整理得到聚类算法的度量方式。是对sklearn包的用户文档的翻译并结合自己的一些理解。
度量聚类算法的性能不是简单的统计错误的数量或计算监督分类算法中的准确率(precision)和召回率(recall)。 特别地,任何度量指标(evaluation metric)不应该考虑到簇标签的绝对值,而是如果这个聚类方式所分离数据类似于部分真实簇分类或者满足某些假设,在同于一个相似性度量(similarity metric)之下,使得属于同一个类内的成员比不同类的成员更加类似。也就是说:聚类作为无监督学习的一种方法,并不能单纯的以结果的准确性作为衡量算法好坏的唯一标准,没有绝对好的聚类算法,一个算法只需要以某一种特征作为类的划分准则,并将数据样本按照这一特征做出了划分,就是一个好的聚类算法。
常用的度量聚类算法好坏的标准一共有10个,需要按照算法的特征选择合适的性能度量方法。
一、兰德指数
兰德指数分为调整的兰德指数和未调整的兰德指数。未调整的兰德指数类取值区间为 [ 0 , 1 ] [0,1] [0,1],没有一个固定的值表示两个随即标签的关系 ;调整的兰德指数将评分规范到了 [ − 1 , 1 ] [-1,1] [−1,1]之间,以 0.0 0.0 0.0表示两个随机标签的关系。
已知数据集真实簇标签分类labels_true
,和我们的聚类算法基于相同样本所得到的预测标签分类labels_pred
,兰德指数是一个函数,用于测量两个簇标签分配的值的相似度,忽略类簇的标识。
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)
print:0.24...
因为忽略类簇的标识,所以即使标识如下,得到的结果也是一样的
labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [1, 1, 3, 3, 5, 5]
另外, adjusted_rand_score
是 对称的,交换参数不会改变得分。
metrics.adjusted_rand_score(labels_pred,labels_true)
完美的标签的得分为1.0,无相关标签的得分是负数或接近于0.0分。
优点
- 可解释性:未调整的兰德指数评分与
labels_pred
和labels_true
的数量成正比 。 - 对于任意两个随机的标签组,其调整后的兰德系数接近
0.0
- 有界范围:调整或未调整的兰德指数,相似度越低得分越低,相似度越高,得分越高。
- 无需对簇的结构进行任何假设**(就是上面解释的忽略类簇标识和参数对称)**:调整或未调整的兰德指数可用于比较各种聚类算法。
缺点
- 在无监督学习中,数据集一般是没有标注的,但是兰德系数要求数据有准确的标注。但是,兰德系数在纯无监督的环境中也可以用作共识索引的基础,该共识索引可以用于聚类模型选择(应该是对不同聚类算法的
labels_pred
之间进行评判,可以将结果更为相似的算法的labels_pred
作为labels_true
)。 - 未经调整的兰德系数即使聚类本身存在显著差异,其结果也通常接近1.0。当将兰德系数解释为由聚类产生的结果
labels_pred
对标记labels_true
的准确性时,更好理解。(应该是说在一个聚类算法中,当准确率取值大于0.5时,就用该数表示准确率;当准确率取值小于0.5时,就用1减去该数作为准确率)。
数学公式
如果C
是一个真实簇的标签分配,K
是簇的个数,我们定义a
和b
如:
a
为在C
中的相同集合的与K
中的相同集合中的元素对数b
为在C
中的不同集合与K
中的不同集合中的元素对数
未经调整的兰德系数由下式给出:
RI
=
a
+
b
C
2
n
s
a
m
p
l
e
s
\text{RI} = \frac{a + b}{C_2^{n_{samples}}}
RI=C2nsamplesa+b
其中
C
2
n
s
a
m
p
l
e
s
C_2^{n_{samples}}
C2nsamples为数据集中可能的数据对数**(不对数据进行排序,即将同一类放在一起)**。
然而,RI
得分不能保证随机标签分配会获得接近零的值(特别是如果簇的数量与样本数量有着相同的规模排序)(所以要进行调整兰德系数)。
为了抵消这种影响,我们可以对预期的RI进行一种运算(discount)
E
[
RI
]
E[\text{RI}]
E[RI],通过如下定义调整后的兰德指数来设置随机标签:
ARI
=
RI
−
E
[
RI
]
max
(
RI
)
−
E
[
RI
]
\text{ARI} = \frac{\text{RI} - E[\text{RI}]}{\max(\text{RI}) - E[\text{RI}]}
ARI=max(RI)−E[RI]RI−E[RI]
二、基于互信息的度量
已知数据集真实簇标签分类labels_true
,和我们的聚类算法基于相同样本所得到的预测标签分类labels_pred
,互信息用于测量两个类簇标签的一致性,忽略标签的排列。这种测量方案有两个不同的标准化版本可用,Normalized Mutual Information(NMI) 和 Adjusted Mutual Information(AMI)(规范化互信息(NMI)和调整后的互信息(AMI))NMI在文献中经常使用,而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)
print:0.22504...
- 在预测的标签列表中重新排列 0 和 1, 或把 2 重命名为 3, 得到相同的得分**(即忽略类簇标识和排列)**。
mutual_info_score
(为上诉的MI),adjusted_mutual_info_score
(为上述AMI)和normalized_mutual_info_score
(为上述NMI)三个函数的参数是对称的,互换位置不影响评测结果。- 完美标签得分为1.0,但是
mutual_info_score
(为上诉的MI)的完美标签得分不为1.0 mutual_info_score
(为上诉的MI),adjusted_mutual_info_score
(为上述AMI)和normalized_mutual_info_score
(为上述NMI)三种方法对随机标签的得分为负数。
优点
- 随机标签的AMI得分接近0.0
- 数值趋近于零,是说明两个标签分配之间是独立,无关联;而数值趋近于一时, 表示两者之间有着极高的一致性。 甚至,当AMI的取值正好是 1 时, 说明两个标签分配时完全相等的**(无论是否排列过)**。
缺点
- 在无监督学习中,数据集一般是没有标注的,但是基于互信息的度量所使用的数据需要有标注
- NMI 和 MI 不能进行使得随机标签度量的得分为0的调整**(可以理解为该性能度量即使对一个对标签预测完全错误的算法也不会得0分)**。
数学公式
假设有两个标签分配U和V(两个结果集),其中具有相同的标签对数N,它们的熵是分区集的不确定性量,其定义为:
H
(
U
)
=
−
∑
i
=
1
∣
U
∣
P
(
i
)
log
(
P
(
i
)
)
H(U) = - \sum_{i=1}^{|U|}P(i)\log(P(i))
H(U)=−i=1∑∣U∣P(i)log(P(i))
其中
P
(
i
)
=
∣
U
i
∣
/
N
P(i) = |U_i| / N
P(i)=∣Ui∣/N是从U中随机选取得对象,选取对象落入到类
U
i
U_i
Ui的概率。
同样,对于V:
H
(
V
)
=
−
∑
j
=
1
∣
V
∣
P
′
(
j
)
log
(
P
′
(
j
)
)
H(V) = - \sum_{j=1}^{|V|}P'(j)\log(P'(j))
H(V)=−j=1∑∣V∣P′(j)log(P′(j))
使用
P
′
(
j
)
=
∣
V
j
∣
/
N
P'(j) = |V_j| / N
P′(j)=∣Vj∣/N和V之间的mutual information
(MI) 由下式计算:
MI
(
U
,
V
)
=
∑
i
=
1
∣
U
∣
∑
j
=
1
∣
V
∣
P
(
i
,
j
)
log
(
P
(
i
,
j
)
P
(
i
)
P
′
(
j
)
)
\text{MI}(U, V) = \sum_{i=1}^{|U|}\sum_{j=1}^{|V|}P(i, j)\log\left(\frac{P(i,j)}{P(i)P'(j)}\right)
MI(U,V)=i=1∑∣U∣j=1∑∣V∣P(i,j)log(P(i)P′(j)P(i,j))
其中
P
(
i
,
j
)
=
∣
U
i
∩
V
j
∣
/
N
P(i, j) = |U_i \cap V_j| / N
P(i,j)=∣Ui∩Vj∣/N是随机选择的对象同时落入两个类的概率
U
i
U_i
Ui和
V
i
V_i
Vi
也可以用设定的基数表达式表示:
MI
(
U
,
V
)
=
∑
i
=
1
∣
U
∣
∑
j
=
1
∣
V
∣
∣
U
i
∩
V
j
∣
N
log
(
N
∣
U
i
∩
V
j
∣
∣
U
i
∣
∣
V
j
∣
)
\text{MI}(U, V) = \sum_{i=1}^{|U|} \sum_{j=1}^{|V|} \frac{|U_i \cap V_j|}{N}\log\left(\frac{N|U_i \cap V_j|}{|U_i||V_j|}\right)
MI(U,V)=i=1∑∣U∣j=1∑∣V∣N∣Ui∩Vj∣log(∣Ui∣∣Vj∣N∣Ui∩Vj∣)
归一化被定义为:
NMI
(
U
,
V
)
=
MI
(
U
,
V
)
mean
(
H
(
U
)
,
H
(
V
)
)
\text{NMI}(U, V) = \frac{\text{MI}(U, V)}{\text{mean}(H(U), H(V))}
NMI(U,V)=mean(H(U),H(V))MI(U,V)
mutual information
(MI) 的值以及归一化变量的值都不会为随机标签度量而调整,但是会随着不同的簇标签数量的增加,不管标签分配之间的 mutual information
(MI)的实际数量如何,都会趋向于增加。
可以使用以下公式计算互信息的期望值在这个等式中
a
i
=
∣
U
i
∣
a_i = |U_i|
ai=∣Ui∣(中的元素数
U
i
U_i
Ui) 和
b
j
=
∣
V
j
∣
b_j = |V_j|
bj=∣Vj∣ (中的元素数
V
j
V_j
Vj)。
E
[
MI
(
U
,
V
)
]
=
∑
i
=
1
∣
U
∣
∑
j
=
1
∣
V
∣
∑
n
i
j
=
(
a
i
+
b
j
−
N
)
+
min
(
a
i
,
b
j
)
n
i
j
N
log
(
N
.
n
i
j
a
i
b
j
)
a
i
!
b
j
!
(
N
−
a
i
)
!
(
N
−
b
j
)
!
N
!
n
i
j
!
(
a
i
−
n
i
j
)
!
(
b
j
−
n
i
j
)
!
(
N
−
a
i
−
b
j
+
n
i
j
)
!
E[\text{MI}(U,V)]=\sum_{i=1}^{|U|} \sum_{j=1}^{|V|} \sum_{n_{ij}=(a_i+b_j-N)^+ }^{\min(a_i, b_j)} \frac{n_{ij}}{N}\log \left( \frac{ N.n_{ij}}{a_i b_j}\right) \frac{a_i!b_j!(N-a_i)!(N-b_j)!}{N!n_{ij}!(a_i-n_{ij})!(b_j-n_{ij})! (N-a_i-b_j+n_{ij})!}
E[MI(U,V)]=i=1∑∣U∣j=1∑∣V∣nij=(ai+bj−N)+∑min(ai,bj)Nnijlog(aibjN.nij)N!nij!(ai−nij)!(bj−nij)!(N−ai−bj+nij)!ai!bj!(N−ai)!(N−bj)!
使用期望值,可以使用与调整后的兰德指数相似的形式来计算调整后的共同信息:
AMI
=
MI
−
E
[
MI
]
mean
(
H
(
U
)
,
H
(
V
)
)
−
E
[
MI
]
\text{AMI} = \frac{\text{MI} - E[\text{MI}]}{\text{mean}(H(U), H(V)) - E[\text{MI}]}
AMI=mean(H(U),H(V))−E[MI]MI−E[MI]
对于归一化的互信息和调整后的互信息,归一化值通常是每个聚类的熵的某个广义均值。存在各种广义的手段,并且不存在确定一种偏于另一种的坚决规则。该决定在很大程度上是逐个领域进行的;例如,在社区检测中,算术平均值是最常见的。每种归一化方法都提供“定性相似的行为”,在我们的实现中,这由average_method
参数控制。
三、同质性,完整性和 V-measure
已知真实簇标签分配,可以使用 条件熵分析来定义一些直观的度量
特别是 Rosenberg 和 Hirschberg (2007) 为任何簇分配定义了以下两个理想的目标:
- 同质性(homogeneity): 每个簇只包含一个类的成员
- 完整性(completeness): 给定类的所有成员都分配给同一个簇
我们可以把这些概念转化为得分homogeneity_score
和 completeness_score
。两者均在 0.0 以下 和 1.0 以上(越高越好):
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)
print:0.66
metrics.completeness_score(labels_true, labels_pred)
print:0.42
称为 V-measure 的调和平均数(harmonic mean)由以下函数计算 v_measure_score
,该函数公式如下:
v
=
(
1
+
β
)
×
homogeneity
×
completeness
(
β
×
homogeneity
+
completeness
)
v = \frac{(1 + \beta) \times \text{homogeneity} \times \text{completeness}}{(\beta \times \text{homogeneity} + \text{completeness})}
v=(β×homogeneity+completeness)(1+β)×homogeneity×completeness
beta
默认值为1.0,但对于beta
使用小于1的值,则为:
metrics.v_measure_score(labels_true, labels_pred, beta=0.6)
print:0.54...
更大的beta
权重将提高同质性,当使用大于1的beta
值时:
metrics.v_measure_score(labels_true, labels_pred, beta=1.8)
print:0.48...
进一步增大的beta
权重将提高完整性。
V-measure 实际上等于上面讨论的 mutual information (NMI) , 仅仅是聚合函数(aggregation function)是算术均值.
同质性, 完整性 and V-measure 可以使用homogeneity_completeness_v_measure
进行计算 如下:
metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
print:(0.66..., 0.42..., 0.51...)
以下聚类分配稍微好一些,因为它是同质但并不完整:
labels_pred = [0, 0, 0, 1, 2, 2]
metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
print:(1.0, 0.68..., 0.81...)
注意: v_measure_score
是对称的: 它可以用于评估同一数据集上两个 无相关标签分配(independent assignments)的 一致性。 completeness_score
homogeneity_score
却不适用于上述情况: 两者间存在下述约束:
py homogeneity_score(a, b) == completeness_score(b, a)
优点
- Bounded scores(有界的分数): 0.0 是最坏的, 1.0 是一个完美的分数.
- Intuitive interpretation(直观解释): 具有不良 V-measure 的聚类可以在同质性和完整性方面进行定性分析以更好地感知到标签分配过程中的错误类型。
- No assumption is made on the cluster structure(对簇的结构没有作出任何假设): 可以用于比较不同类的聚类算法,例如: k-means 和 spectral clustering algorithms(谱聚类算法)间的比较。虽然,前者的簇是isotropic blob shapes, 后者的簇是 folded shapes。
缺点
-
之前介绍的度量标准(metrics)并不针对随机标记进行标准化(not normalized with regards to random labeling): 这意味着,依赖样本数量,簇数量和 标定过的真实数据类数量,完全随机的标注方式并不总是产生 同质性,完整性 和 v-measure 的相同值。特别是 随机标注不会产生零分,特别是当簇数量大时。
当样本数量超过 1000,簇的数量小于 10 时,可以安全地忽略此问题。对于较小的样本数量或者较大数量的簇,使用 adjusted index 例如 Adjusted Rand Index (ARI))。
数学公式
同质性和完整性的得分由下面公式给出:
h
=
1
−
H
(
C
∣
K
)
H
(
C
)
h = 1 - \frac{H(C|K)}{H(C)}
h=1−H(C)H(C∣K)
c = 1 − H ( K ∣ C ) H ( K ) c = 1 - \frac{H(K|C)}{H(K)} c=1−H(K)H(K∣C)
其中
H
(
C
∣
K
)
H(C|K)
H(C∣K)是给定簇分配的类的条件熵,由下式给出:
H
(
C
∣
K
)
=
−
∑
c
=
1
∣
C
∣
∑
k
=
1
∣
K
∣
n
c
,
k
n
⋅
log
(
n
c
,
k
n
k
)
H(C|K) = - \sum_{c=1}^{|C|} \sum_{k=1}^{|K|} \frac{n_{c,k}}{n} \cdot \log\left(\frac{n_{c,k}}{n_k}\right)
H(C∣K)=−c=1∑∣C∣k=1∑∣K∣nnc,k⋅log(nknc,k)
并且
H
(
C
)
H(C)
H(C)是已聚合的类的熵,并且由下式给出:
H
(
C
)
=
−
∑
c
=
1
∣
C
∣
n
c
n
⋅
log
(
n
c
n
)
H(C) = - \sum_{c=1}^{|C|} \frac{n_c}{n} \cdot \log\left(\frac{n_c}{n}\right)
H(C)=−c=1∑∣C∣nnc⋅log(nnc)
n
n
n 样本总数
n
c
n_c
nc 和
n
k
n_k
nk 分别是属于类别的样本数
c
c
c 和集群
k
k
k的样本数,最后
n
c
,
k
n_{c,k}
nc,k 分配给类
c
c
c 和簇
k
k
k 的样本数。
给定类分配的簇的条件熵 H ( K ∣ C ) H(K|C) H(K∣C)和簇的熵 H ( K ) H(K) H(K)以对称的形式定义。
Rosenberg 和 Hirschberg 进一步定义 V-measure 作为同质性和完整性的调和均值:
v
=
2
⋅
h
⋅
c
h
+
c
v = 2 \cdot \frac{h \cdot c}{h + c}
v=2⋅h+ch⋅c
四、Fowlkes-Mallows 得分
当数据集的分类情况已知时,可以使用Fowlkes-Mallows得分(sklearn.metrics.fowlkes_mallows_score
) 。Fowlkes-Mallows 得分 FMI 被定义为 成对的准确率和召回率的几何平均值:
FMI
=
TP
(
TP
+
FP
)
(
TP
+
FN
)
\text{FMI} = \frac{\text{TP}}{\sqrt{(\text{TP} + \text{FP}) (\text{TP} + \text{FN})}}
FMI=(TP+FP)(TP+FN)TP
其中的 TP
是 真正例(True Positive) 的数量(即,真实标签组和预测标签组中属于相同簇的点对数),FP
是 假正例(False Positive) (即,在真实标签组中属于同一簇的点对数,而不在预测标签组中),FN
是 假负例(False Negative) 的数量(即,预测标签组中属于同一簇的点对数,而不在真实标签组中)。
- 得分范围为 0 到 1。较高的值表示两个簇之间的良好相似性。
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)
print:0.47140...
- 在预测的标签列表中重新排列 0 和 1, 或把 2 重命名为 3, 得到相同的得分**(即忽略类簇标识和排列)**。
- 完美的标签得分是 1.0
- 无相关标签的得分为 0
优点
- 随机标签的FMI得分接近0.0
- 正好为0的值表示完全独立的标签分配
- 对簇的结构没有任何要求,可以用于比较不同类的聚类算法
缺点
- 基于 FMI 的测量方案需要使用有标注的数据集
五、 Silhouette 系数(轮廓系数)
若数据集未标注,则聚类算法的性能必须使用模型本身进行评估。轮廓系数(sklearn.metrics.silhouette_score
)是这种评估的一种方法 ,更好的聚类模型会得到更好地轮廓系数得分。为每个样本定义了轮廓系数,该系数由两个分数组成:
- a:样本与同一类别中所有其他点之间的平均距离。
- b:样本与下一个最近的簇中所有其他点之间的平均距离。
单个样本的轮廓系数s标识为:
s
=
b
−
a
m
a
x
(
a
,
b
)
s = \frac{b - a}{max(a, b)}
s=max(a,b)b−a
一组样本的轮廓系数作为每个样本轮廓系数的平均值给出。
from sklearn import metrics
from sklearn.metrics import pairwise_distances
from sklearn import datasets
X, y = datasets.load_iris(return_X_y=True)
在正常使用中,轮廓系数将应用于聚类分析的结果。
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')
print:0.55
优点
- 对于不正确的聚类,分数为-1;对于高密度的聚类,分数为+1;0附近表示重叠的聚类。
- 当簇密集且分离较好时,分数更高。
- 无需使用有标注的数据集。
缺点
凸簇的轮廓系数通常比其他类型的簇更高
六、Calinski-Harabaz 指数
如果数据集没有标注,则可以使用Calinski-Harabasz指数(sklearn.metrics.calinski_harabasz_score
)(也称为方差比标准)来评估模型,其中较高的Calinski-Harabasz得分与具有更好定义的群集的模型有关。
该指数是所有集群的集群间离散度和集群内离散度之和的比值(其中,离散度定义为距离平方的总和):
from sklearn import metrics
from sklearn.metrics import pairwise_distances
from sklearn import datasets
X, y = datasets.load_iris(return_X_y=True)
在正常使用中,将Calinski-Harabasz指数应用于聚类分析的结果:
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_harabasz_score(X, labels)
print:561.62...
优点
- 当群集密集且间隔良好时,分数会更高。
- 该分数可以快速计算。
缺点
- 凸聚类的Calinski-Harabasz索引通常比聚类的其他概念更高,例如基于密度的聚类(如通过DBSCAN获得的聚类)。
数学公式
已知数据集
E
E
E的大小为
n
E
n_E
nE,被分
k
k
k个集群,Calinski-Harabasz得分
s
s
s定义为群集间分散度平均值与群集内分散度的比率:
s
=
t
r
(
B
k
)
t
r
(
W
k
)
×
n
E
−
k
k
−
1
s = \frac{\mathrm{tr}(B_k)}{\mathrm{tr}(W_k)} \times \frac{n_E - k}{k - 1}
s=tr(Wk)tr(Bk)×k−1nE−k
其中
t
r
(
B
k
)
\mathrm{tr}(B_k)
tr(Bk)为组间方差矩阵的迹,
t
r
(
W
k
)
\mathrm{tr}(W_k)
tr(Wk)是簇内方差矩阵的迹:
W
k
=
∑
q
=
1
k
∑
x
∈
C
q
(
x
−
c
q
)
(
x
−
c
q
)
T
W_k = \sum_{q=1}^k \sum_{x \in C_q} (x - c_q) (x - c_q)^T
Wk=q=1∑kx∈Cq∑(x−cq)(x−cq)T
B k = ∑ q = 1 k n q ( c q − c E ) ( c q − c E ) T B_k = \sum_{q=1}^k n_q (c_q - c_E) (c_q - c_E)^T Bk=q=1∑knq(cq−cE)(cq−cE)T
N N N为数据集中的点数, C q C_q Cq为簇 q q q中的点集, c q c_q cq为簇 q q q的中心, c c c为 E E E的中心, n q n_q nq为簇 q q q中的点数。
七、Davies-Bouldin 指数
如果数据集有标签,sklearn.metrics.davies_bouldin_score
则可以使用Davies-Bouldin指数评估模型,Davies-Bouldin指数越低,聚类的效果越好。
该指数表示聚类之间的平均“相似度”,其中相似度是一种将聚类之间的距离与聚类本身的大小进行比较的度量。
将Davies-Bouldin索引应用于聚类分析的结果,如下所示:
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
from sklearn.cluster import KMeans
from sklearn.metrics import davies_bouldin_score
kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans.labels_
davies_bouldin_score(X, labels)
print:0.6619...
优点
- Davies-Bouldin 指数的计算比轮廓系数更加简单
- Davies-Bouldin 指数仅用于计算数据集内的数量和特征
缺点
- 凸簇的Davies-Bouldin 指数通常比其他类型的簇更高。
- 在一般情况下, 质心距离只能使用欧氏空间内的距离度量来衡量。
- 该方法得出的一个好的值并不意味着这是最好的信息检测技术。
数学公式
Davies-Bouldin 指数定义为每个聚类之间的平均相似度, C i C_i Ci 为了 i = 1 , . . . , k i=1, ..., k i=1,...,k和它最相似的一个 C j C_j Cj。在该指数中,相似度被定义为一个用于协调的度量:
- s i s_i si,集群中每个点之间的平均距离 i i i 以及该簇的质心-也称为簇直径。
- d i j d_{ij} dij,簇质心之间的距离 i i i 和$ j$。
以下是一个简单构建
R
i
j
R_{ij}
Rij 的方法,使得它具有非负性和对称性:
R
i
j
=
s
i
+
s
j
d
i
j
R_{ij} = \frac{s_i + s_j}{d_{ij}}
Rij=dijsi+sj
然后将Davies-Bouldin 指数定义为:
D
B
=
1
k
∑
i
=
1
k
max
i
≠
j
R
i
j
DB = \frac{1}{k} \sum_{i=1}^k \max_{i \neq j} R_{ij}
DB=k1i=1∑ki=jmaxRij
八、Contingency Matrix(可能性矩阵)
可能性矩阵记录了每个真实/预测簇对之间的交叉基数。可能性矩阵为所有的聚合度量提供了足量的统计数据,在这些度量中样本是独立同分布的。
from sklearn.metrics.cluster import contingency_matrix
x = ["a", "a", "a", "b", "b", "b"]
y = [0, 0, 1, 1, 2, 2]
contingency_matrix(x, y)
print:array([[2, 1, 0],
[0, 1, 2]])
输出数组的第一行指示存在三个样本,其真实簇为“ a”。其中两个在预测聚类0中,一个在1中,一个都不在2中。第二行表示存在三个样本,其真实聚类为“ b”。其中,没有一个在预测聚类0中,一个在1中,两个在2中。
用于聚类的可能性矩阵是一个square contingency matrix,其中行和列的顺序对应于类别列表。
优点
- 允许检查每个真实簇在预测簇中的分布,反之亦然。
- 计算得出的列联表通常用于计算两个聚类之间的相似性统计信息(如本文档中列出的其他相似性统计信息)。
缺点
- 权变矩阵对于少量的群集很容易解释,但是对于大量的群集则很难解释。
- 它没有给出一个单一的指标来用作集群优化的目标。
九、Pair Confusion Matrix(配对混淆矩阵)
配对混淆矩阵(sklearn.metrics.cluster.pair_confusion_matrix
)是2x2相似矩阵。
C
=
[
C
00
C
01
C
10
C
11
]
C = \left[\begin{matrix} C_{00} & C_{01} \\ C_{10} & C_{11} \end{matrix}\right]
C=[C00C10C01C11]
通过考虑所有样本对并计算在真实和预测聚类下分配到相同或不同聚类中的对来计算两个聚类之间的差。
各个元素的含义为:
C 00 C_{00} C00 :具有两个聚类且样本未聚在一起的对的数量
C 10 C_{10} C10 :具有真实标签聚类且样本聚在一起但其他聚类中样本不聚在一起的对的数量
C 01 C_{01} C01 :具有真实标签聚类的对的数量,这些聚类没有将样本聚类在一起,但是将样本聚在一起的其他聚类
C 11 C_{11} C11 :具有两个聚类且样本被聚在一起的对的数量
考虑一对成对的正样本,那么在二元分类中,真正的负数为 C 00 C_{00} C00,假阴性为 C 10 C_{10} C10,真正的积极因素是 C 01 C_{01} C01误报是 C 11 C_{11} C11。
完全匹配的标签在对角线上具有所有非零的条目,而不管实际的标签值如何:
from sklearn.metrics.cluster import pair_confusion_matrix
pair_confusion_matrix([0, 0, 1, 1], [0, 0, 1, 1])
print:array([[8, 0],
[0, 4]])
pair_confusion_matrix([0, 0, 1, 1], [1, 1, 0, 0])
print:array([[8, 0],
[0, 4]])
将所有类成员分配到同一集群的标签是完整的,但可能并不总是绝对的,因此会受到惩罚,并且具有一些非对角线的非零条目:
pair_confusion_matrix([0, 0, 1, 2], [0, 0, 1, 1])
print:array([[8, 2],
[0, 2]])
矩阵不对称:
pair_confusion_matrix([0, 0, 1, 1], [0, 0, 1, 2])
print:array([[8, 0],
[2, 2]])
如果将类成员完全拆分为不同的群集,则分配完全不完整,因此矩阵的对角线条目全部为零:
pair_confusion_matrix([0, 0, 0, 0], [0, 1, 2, 3])
print:array([[ 0, 0],
[12, 0]])