外部指标(有真实标签)
兰德指数(RI)
取值为
[
0
−
1
]
[0-1]
[0−1] 越大越表明聚类结果与真实结果吻合
R
I
=
a
+
b
c
n
2
RI=\frac{a+b}{c_n^2}
RI=cn2a+b
- a:在预测结果和真实标签中都属于同一簇的样本对的数量
- b:在预测结果和真实标签中都不属于同一簇的样本对的数量
- c n 2 c_n^2 cn2:组合数
def RI(Y_pred, Gt):
a=0
b=0
n = len(Gt)
for i in range(n):
for j in range(n):
if Y_pred[i]==Y_pred[j] and Gt[i]==Gt[j] :
a += 1
elif Y_pred[i]!=Y_pred[j] and Gt[i]!=Gt[j]:
b += 1
return (a+b)*2/(n*(n-1))
调整兰德指数(ARI)
由于当两个划分是随机的时候RI的值并不为0,所以对其进行调整。
A
R
I
=
∑
i
j
C
n
i
j
2
−
[
∑
i
C
a
i
2
∑
j
C
b
j
2
]
/
C
n
2
1
2
[
∑
i
C
a
i
2
+
∑
j
C
b
j
2
]
−
[
∑
i
C
a
i
2
∑
j
C
b
j
2
]
/
C
n
2
ARI=\frac{\sum_{ij}{C^2_{n_{ij}}}-[\sum_iC^2_{a_i}\sum_jC^2_{b_j}]/C^2_n}{\frac{1}{2}[\sum_iC^2_{a_i}+\sum_jC^2_{b_j}]-[\sum_iC^2_{a_i}\sum_jC^2_{b_j}]/C^2_n}
ARI=21[∑iCai2+∑jCbj2]−[∑iCai2∑jCbj2]/Cn2∑ijCnij2−[∑iCai2∑jCbj2]/Cn2
取值范围为
[
−
1
,
1
]
[-1,1]
[−1,1],当两个划分是随机的时候,ARI的值为0。
-
首先要得到列联表
-
c n 2 c_n^2 cn2:组合数
可直接调用sklean中的代码
ARI = metrics.adjusted_rand_score(X, Y)
标准互信息(NMI)
通过互信息来度量两个划分之间的相似度,取值在
[
0
−
1
]
[0-1]
[0−1]之间。
N
I
M
=
2
∗
I
(
X
,
Y
)
H
(
X
)
+
H
(
Y
)
NIM = \frac{2*I(X,Y)}{H(X)+H(Y)}
NIM=H(X)+H(Y)2∗I(X,Y)
- H ( X ) H(X) H(X):代表X的熵 H ( X ) = ∑ p ( x ) ∗ l o g p ( x ) H(X)=\sum{p(x)*logp(x)} H(X)=∑p(x)∗logp(x)
-
I
(
X
,
Y
)
I(X,Y)
I(X,Y):代表X和Y之间的互信息
I
(
X
,
Y
)
=
∑
x
∑
y
p
(
x
,
y
)
∗
l
o
g
p
(
x
,
y
)
p
(
x
)
p
(
y
)
I(X,Y)=\sum_x\sum_y{p(x,y)*log\frac{p(x,y)}{p(x)p(y)}}
I(X,Y)=∑x∑yp(x,y)∗logp(x)p(y)p(x,y)
可直接调用sklean
NMI = metrics.normalized_mutual_info_score(X,Y)
同质性和完整性
同质:簇内是否只包含同一类别的样本。
完整:同一类别的样本点是否被划分到同一簇内。
K
=
1
−
H
(
Y
∣
X
)
H
(
Y
)
K = 1-\frac{H(Y|X)}{H(Y)}
K=1−H(Y)H(Y∣X)
C
=
1
−
H
(
X
∣
Y
)
H
(
X
)
C = 1-\frac{H(X|Y)}{H(X)}
C=1−H(X)H(X∣Y)
- X为预测结果,Y为标签
- H ( X ) H(X) H(X):代表X的熵 H ( X ) = ∑ p ( x ) ∗ l o g p ( x ) H(X)=\sum{p(x)*logp(x)} H(X)=∑p(x)∗logp(x)
K = metrics.homogeneity_score(Y,X)
C = metrics.completeness_score(Y, X)
V-Measure
同时考虑到同质性和完整性
V
−
M
e
a
s
u
r
e
=
(
1
+
β
)
∗
K
∗
C
β
∗
K
+
C
V-Measure = \frac{(1+\beta)*K*C}{\beta*K+C}
V−Measure=β∗K+C(1+β)∗K∗C
V-Measure = metrics.v_measure_score(Y, X)
内部指标(无真实标签)
轮廓分数(Silhouette Score)
轮廓分数主要基于样本点与簇内和相邻簇内的相似度,距离来计算的,数值越高越好
S
c
o
r
e
=
a
+
b
m
a
x
(
a
,
b
)
Score = \frac{a+b}{max(a,b)}
Score=max(a,b)a+b
- a:样本点距离簇内样本点的平均距离
- b:样本点距离最近簇中样本的平均距离
Silhouette_Score = metrics.silhouette_score(X, km_labels, metric='euclidean')
∣ ∣ [ E ∗ ] : , i ∣ ∣ 2 − m i n m a x − m i n \frac{||[E^*]_{:,i}||_2-min}{max-min} max−min∣∣[E∗]:,i∣∣2−min
∣ ∣ [ E ∗ ] : , i ∣ ∣ 2 − ∣ ∣ [ W ] : , i ∣ ∣ 2 − m i n m a x − m i n s . t . W i , i = 0 \frac{||[E^*]_{:,i}||_2-||[W]_{:,i}||_2-min}{max-min} \space s.t.\space W_{i,i}=0 max−min∣∣[E∗]:,i∣∣2−∣∣[W]:,i∣∣2−min s.t. Wi,i=0