外部指标
Jaccard系数
FM指数
举例子
MI 互信息
信息熵
衡量信息的平均不确定性,非负性
H ( y ) = −
∑
i
=
1
k
∑ _{i = 1} ^k
∑i=1k
p
i
p _i
pi log
p
i
p _i
pi
i为当前的簇
k为总的簇数
p
i
p_i
pi为任意一个样本被分到第i簇的概率
比如:
对于真实标记y_true=np.array([0,0,1,1,2,2])
k=3
p
0
p_0
p0=2/6=1/3
p
1
p_1
p1=2/6=1/3
p
2
p_2
p2=2/6=1/3
则y_true的熵
H(y_true)=-1/3log(1/3)-1/3log(1/3)-1/3log(1/3)=log3
这里的对数底常取 2或者e
列联表
真实标签向量 y_true=np.array([0,0,1,1,2,2])
预测标签向量 y_pred=np.array([0,0,0,1,1,1])
列联表(contingency table),满足
m
i
j
m _{i j}
mij = ∣
y
t
r
u
e
i
y_{true_i}
ytruei∩
y
p
r
e
d
j
y_{pred_j}
ypredj∣
y
t
r
u
e
i
y_{true_i}
ytruei,真实标签中第i簇的样本集合
y
p
r
e
d
j
y_{pred_j}
ypredj,聚类簇中第j簇的样本集合
m
i
j
m _{i j}
mij,真实标签中第 i 簇的样本集合与聚类簇中第 j 簇的样本集合 交集的样本数
则有
y
t
r
u
e
0
y_{true_0}
ytrue0={0,1}
y
t
r
u
e
1
y_{true_1}
ytrue1={2,3}
y
t
r
u
e
2
y_{true_2}
ytrue2={4,5}
y
p
r
e
d
0
y_{pred_0}
ypred0={0,1,2}
y
p
r
e
d
1
y_{pred_1}
ypred1={3,4,5}
y
p
r
e
d
2
y_{pred_2}
ypred2={}
列联表为
M=
[
m
00
m
01
m
02
m
10
m
11
m
12
m
20
m
21
m
22
]
\begin{gathered} \begin{bmatrix} m _{0 0} & m _{0 1} & m _{0 2} \\m _{1 0} & m _{1 1} & m _{1 2} \\ m _{2 0} & m _{2 1} & m _{2 2} \end{bmatrix} \end{gathered}
⎣⎡m00m10m20m01m11m21m02m12m22⎦⎤
M=
[
2
0
0
1
1
0
0
2
0
]
\begin{gathered} \begin{bmatrix} 2 & 0 & 0 \\1 & 1 & 0 \\ 0 & 2 & 0 \end{bmatrix} \end{gathered}
⎣⎡210012000⎦⎤
互信息的计算公式如下:
MI( y t r u e y_{true} ytrue, y p r e d y_{pred} ypred) = ∑ i = 1 k ∑_{i = 1} ^k ∑i=1k ∑ j = 1 k ∑_{j= 1} ^k ∑j=1k p i , j p_{i , j} pi,jlog ( p i , j p_{i , j} pi,j / p i p_i pi × p j p_j pj )
其中
p
i
,
j
p_{i , j}
pi,j =
m
i
,
j
m_{i,j}
mi,j/m m为总样本数
p
i
p_i
pi=|
y
t
r
u
e
i
y_{true_i}
ytruei|/m
p
j
p_j
pj=|
y
p
r
e
d
j
y_{pred_j}
ypredj|/m
则根据y_true,y_pred标记值可以得到:
p
i
,
j
p_{i , j}
pi,j矩阵
[
1
/
3
0
0
1
/
6
1
/
6
0
0
1
/
3
0
]
\begin{gathered} \begin{bmatrix} 1/3 & 0 & 0 \\1/6 & 1/6 & 0 \\ 0 & 1/3 & 0 \end{bmatrix} \end{gathered}
⎣⎡1/31/6001/61/3000⎦⎤
p
i
p_i
pi=[1/3 1/3 1/3]
p
j
p_j
pj=[1/2 1/2 0]
则MI(
y
t
r
u
e
y_{true}
ytrue,
y
p
r
e
d
y_{pred}
ypred)=1/3log2+1/6log1+1/6log1+1/3log2=2/3log2=0.4621
这里取e为底
使用sklearn.metrics.mutual_info_score可以得到同样的结果
NMI标准化互信息
标准化互信息的计算方法如下:
NMI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred) = MI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred) / F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))
通常F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))采用算数平均值
F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))=(H (
y
t
r
u
e
y_{true}
ytrue)+H(
y
p
r
e
d
y_{pred}
ypred)/2
则NMI( y t r u e y_{true} ytrue , y p r e d y_{pred} ypred) =MI( y t r u e y_{true} ytrue , y p r e d y_{pred} ypred) / 1/2(H ( y t r u e y_{true} ytrue)+H( y p r e d y_{pred} ypred))
据y_true,y_pred的标记值可得:
MI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred) =2/3log2
H (
y
t
r
u
e
y_{true}
ytrue)=log3
H(
y
p
r
e
d
y_{pred}
ypred)=log2
则NMI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred)=(2/3log2) / 1/2(log3+log2)=0.5158
以e为底
sklearn.metrics.normalized_mutual_info_score同样可以算得0.5295
只不过sklearn里实现的F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))采用几何平均值
F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))=np.sqrt( H(
y
t
r
u
e
y_{true}
ytrue)*H(
y
p
r
e
d
y_{pred}
ypred) )
sklearn计算熵:from sklearn.metrics.cluster import entropy
AMI调整互信息
调整互信息的计算要复杂一些,其计算方法如下:
AMI( y t r u e y_{true} ytrue , y p r e d y_{pred} ypred) = M I ( y t r u e , y p r e d ) − E { MI ( y t r u e , y p r e d ) } F ( H ( y t r u e ) , H ( y p r e d ) ) − E { MI ( y t r u e , y p r e d ) } \frac {MI( y_{true} , y_{pred}) - \mathbb E\left\{ \text{MI}( y_{true} , y_{pred})\right\} } {F (H (y_{true}) ,H(y_{pred})) − \mathbb E\left\{ \text{MI}( y_{true} , y_{pred})\right\} } F(H(ytrue),H(ypred))−E{MI(ytrue,ypred)}MI(ytrue,ypred)−E{MI(ytrue,ypred)}
其中, E { MI ( y t r u e , y p r e d ) } \mathbb E\left\{ \text{MI}(y_{true}, y_{pred}) \right\} E{MI(ytrue,ypred)}为互信息 MI ( y t r u e , y p r e d ) \text{MI}(y_{true}, y_{pred}) MI(ytrue,ypred) 的期望,计算方法为
E { MI ( y t r u e , y p r e d ) } = ∑ i = 1 k ∑ j = 1 k ∑ z = ( a i + b j − m ) + m i n ( a i , b j ) z m l o g ( m × z a i × b j ) a i ! b j ! ( m − a i ) ! ( m − b j ) ! m ! z ! ( a i − z ) ! ( b j − z ) ! ( m − a i − b j + z ) ! \mathbb E\left\{ \text{MI}(y_{true}, y_{pred}) \right\} = ∑_{i = 1} ^k ∑_{j = 1} ^k ∑_{z = ( a_i + b_j − m )^+} ^{min ( a_i , b_j )} \frac {z} {m} log ( \frac{m × z} {a_i × b_j} ) \frac{a_i ! b_j ! ( m − a_i ) ! ( m − b_j ) !} {m ! z ! ( a_i − z ) ! ( b_j − z ) ! ( m − a_i − b_j + z ) ! } E{MI(ytrue,ypred)}=∑i=1k∑j=1k∑z=(ai+bj−m)+min(ai,bj)mzlog(ai×bjm×z)m!z!(ai−z)!(bj−z)!(m−ai−bj+z)!ai!bj!(m−ai)!(m−bj)!
其中
(
a
i
+
b
j
−
m
)
+
( a_i + b_j − m)^+
(ai+bj−m)+为
m
a
x
(
1
,
a
i
+
b
j
−
m
)
max ( 1 , a_i + b_j − m)
max(1,ai+bj−m)
a
i
a_i
ai为列联表M中的第
i
i
i 行的和
b
j
b_j
bj为列联表M中的第
j
j
j 列的和
针对y_true,y_pred的标记值,可以计算得
MI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred) =2/3log2
H (
y
t
r
u
e
y_{true}
ytrue)=log3
H(
y
p
r
e
d
y_{pred}
ypred)=log2
a
0
a_0
a0=2+0+0=2
a
1
a_1
a1=1+1+0=2
a
2
a_2
a2=0+2+0=2
b
0
b_0
b0=2+1+0=3
b
1
b_1
b1=0+1+2=3
b
2
b_2
b2=0+0+0=0
E
{
M
I
(
y
t
r
u
e
,
y
p
r
e
d
)
}
\mathbb E\left\{MI(y_{true}, y_{pred}) \right\}
E{MI(ytrue,ypred)}=2/5log2
计算过程:
i=0 j=0 z=[1,2] sum=0+1/15log2
i=0,j=1,z=[1,2] sum=0+1/15log2
i=0,j=2,z=[] sum=0
.
.
.
则
AMI(
y
t
r
u
e
y_{true}
ytrue ,
y
p
r
e
d
y_{pred}
ypred)=
2
/
3
l
o
g
2
−
2
/
5
l
o
g
2
m
a
x
(
l
o
g
3
,
l
o
g
2
)
−
2
/
5
l
o
g
2
\frac{2/3log2-2/5log2} {max(log3,log2)-2/5log2}
max(log3,log2)−2/5log22/3log2−2/5log2=0.22504
这里计算F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred)) 采用了max函数
也可以采用min函数min(log3,log2),几何平均
l
o
g
3
∗
l
o
g
2
\sqrt {log3*log2}
log3∗log2,算数平均
l
o
g
3
+
l
o
g
2
2
\frac {log3+log2} {2}
2log3+log2
使用sklearn.metrics.adjusted_mutual_info_score计算结果0.22504
sklearn就是使用的max函数计算F(H (
y
t
r
u
e
y_{true}
ytrue),H(
y
p
r
e
d
y_{pred}
ypred))
对于MI,NMI,AMI三者,通常采用NMI和AMI来作为衡量聚类效果的指标
内部指标
轮廓系数
单一样本的轮廓系数
s
(
x
i
)
=
b
(
x
i
)
−
a
(
x
i
)
m
a
x
[
a
(
x
i
)
,
b
(
x
i
)
]
s(x_i) =\frac {b(x_i)-a(x_i)} {max[a(x_i),b(x_i)]}
s(xi)=max[a(xi),b(xi)]b(xi)−a(xi)
样本集S的轮廓系数 ----所有样本轮廓系数的平均值
轮廓系数SC越大,簇内越紧凑,簇间越分散
sklearn的实现:
sklearn.metrics.silhouette_score
X: 样本集数组
labels:聚类标签y_pred
metric:距离度量
DB指数
DB指数越小,簇内越紧凑,簇间越分散
sklearn实现:
sklearn.metrics.davies_bouldin_score
X:样本集数组
labels:聚类标签y_pred
new add in sklearn 0.20.0
Dunn指数
d
m
i
n
(
C
i
,
C
j
)
d_{min}(C_i,C_j)
dmin(Ci,Cj):两个簇中最近样本之间的距离
d
i
a
m
(
C
l
)
diam(C_l)
diam(Cl):簇中最远的两个样本之间的距离
对于一个已完成的聚类,分母是最分散的那个簇中最远的两个样本之间的距离,是一个固定值,记为D
则对k=3时:
i=0, 取
m
i
n
(
[
d
m
i
n
(
C
0
,
C
1
)
D
,
d
m
i
n
(
C
0
,
C
2
)
D
]
)
=
i
0
min([\frac{d_{min}(C_0,C_1)} {D} ,\frac{d_{min}(C_0,C_2)} {D}])=i_0
min([Ddmin(C0,C1),Ddmin(C0,C2)])=i0
i=1,取
m
i
n
(
[
d
m
i
n
(
C
1
,
C
0
)
D
,
d
m
i
n
(
C
1
,
C
2
)
D
]
)
=
i
1
min([\frac{d_{min}(C_1,C_0)} {D} ,\frac{d_{min}(C_1,C_2)} {D}])=i_1
min([Ddmin(C1,C0),Ddmin(C1,C2)])=i1
i=2,取
m
i
n
(
[
d
m
i
n
(
C
2
,
C
0
)
D
,
d
m
i
n
(
C
2
,
C
1
)
D
]
)
=
i
2
min([\frac{d_{min}(C_2,C_0)} {D} ,\frac{d_{min}(C_2,C_1)} {D}])=i_2
min([Ddmin(C2,C0),Ddmin(C2,C1)])=i2
D I = m i n ( [ i 0 , i 1 , i 2 ] ) DI=min([i_0,i_1,i_2]) DI=min([i0,i1,i2])
sklearn实现: