聚类算法是无监督学习的一个重要的应用方向,聚类算法将样本集中的样本划分成若干个不想交的子集,每个子集称为一个“簇”,通过这样的划分,每个簇可能对应于一些潜在的类别。需要说明的是这些分类事先是未知的,聚类仅仅能够自动的形成簇,但是簇对应的概念语义需要我们自己来命名和理解。
聚类算法的一般形式为:
聚类的性能度量方法主要可以分成两个类别,第一个类别是将聚类的结果和某一个“参考模型”进行比较,这称为是外部指标,另外一种方式是直接比较聚类的结果,而不去参考其他模型的结果。这称为是内部指标。
假设,我们采用聚类算法划分出来的簇为 [ C 1 , C 2 , . . , C k ] [C_1,C_2,..,C_k] [C1,C2,..,Ck],而参考模型的聚类结果为 [ C 1 ∗ , C 2 ∗ , C 3 ∗ , . . . . . C s ∗ ] [C_{1}^*,C_{2}^*,C_{3}^*,.....C_{s}^*] [C1∗,C2∗,C3∗,.....Cs∗],同样,我们采用 λ i λ_i λi和 λ i ∗ λ_i^* λi∗作为聚类结果中第i个簇的表示,用 λ i ∗ λ_i^* λi∗作为参考模型中第i个簇的表示。下面定义一些计算为:
由于,每一个样本只能属于一个簇,所以有 a + b + c + d = m ( m − 1 ) 2 a+b+c+d=\frac{m(m-1)}{2} a+b+c+d=2m(m−1)
外部指标1:Jaccard 系数:
J C = a a + b + c JC=\frac{a}{a+b+c} JC=a+b+ca
外部指标2:FMI指数:
F M I = a a + b ∗ a a + c FMI=\sqrt{\frac{a}{a+b}*\frac{a}{a+c}} FMI=a+ba∗a+ca
外部指标3:Rand指数:
R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m−1)2(a+d)
对于上面的指标,值越大聚类的效果就越好。
对于聚类生成的结果,定义如下几个公式:
a v g ( C i ) = 2 ∣ C i ∣ ( ∣ C i ∣ − 1 ) ∑ 1 ≤ i < j ≤ ∣ C i ∣ d i s t ( X i , X j ) avg(C_i)=\frac{2}{|C_i|(|C_i|-1)}∑_{1≤i
其中dist用于计算的是不同的两个样本 X i , X j X_i,X_j Xi,Xj之间的距离, a v g ( C i ) avg(C_i) avg(Ci)表示计算簇 C i C_i Ci下面的样本的之间的距离的平均值。
d i a m ( C i ) = m a x 1 ≤ i < j ≤ ∣ C ∣ d i s t ( X i , X j ) diam(C_i)=max_{1≤i
d i a m ( C i ) diam(C_i) diam(Ci)表示簇 C i C_i Ci下面所有样本中距离最大的两个样本之间的距离值。
d m i n ( C i , C j ) = m i n X i ∈ C i , X j ∈ C j d i s t ( X i , X j ) d_{min}(C_i,C_j)=min_{X_i∈C_i,X_j∈C_j}dist(X_i,X_j) dmin(Ci,Cj)=minXi∈Ci,Xj∈Cjdist(Xi,Xj)
d m i n ( C i , C j ) d_{min}(C_i,C_j) dmin(Ci,Cj)表示两个簇之间的样本的最小距离。
d c e n ( C i , C j ) = d i s t ( μ i , μ j ) d_{cen}(C_i,C_j)=dist(μ_i,μ_j) dcen(Ci,Cj)=dist(μi,μj)
d c e n ( C i , C j ) d_{cen}(C_i,C_j) dcen(Ci,Cj)表示两个簇之间的中心点之间的距离, μ i μ_i μi表示第i个簇的中心点。
μ i = 1 C i ∑ i = 1 ∣ C i ∣ X i , X i ∈ ∣ C ∣ μ_i=\frac{1}{C_i}∑_{i=1}^{|C_i|}X_i,X_i∈|C| μi=Ci1i=1∑∣Ci∣Xi,Xi∈∣C∣
内部指标1:DB 系数
D B I = 1 k ∑ i = 1 k m a x j ≠ i ( a v g ( C i ) + a v g ( C j ) d c e n ( C i , C j ) ) DBI=\frac{1}{k}∑_{i=1}^kmax_{j≠i}(\frac{avg(C_i)+avg(C_j)}{d_{cen}(C_i,C_j)}) DBI=k1i=1∑kmaxj=i(dcen(Ci,Cj)avg(Ci)+avg(Cj))
DBI指数就是不同簇内部距离的平均值和不同簇之间的距离的比值的求和。
内部指标2:Dunn指数
D I = m i n 1 ≤ i ≤ k { m i n j ≠ i d m i n ( C i , C j ) m a x 1 ≤ l ≤ k d i a m ( C l ) } DI = min_{1≤i≤k}\{min_{j≠i}\frac{d_{min}(C_i,C_j)}{max_{1≤l≤k}diam(C_l)}\} DI=min1≤i≤k{minj=imax1≤l≤kdiam(Cl)dmin(Ci,Cj)}
DBI指数越小越好,DI指数越大越好。
对于上面的公式,我们可以发现,其基础在于dist距离的计算,其中最常见的距离计算为闵可夫斯基距离的计算。其基本公式为:
d i s t m k ( X i , X j ) = ( ∑ u = 1 n ∣ X i u − X j u ∣ p ) 1 p dist_{mk}(X_i,X_j)=(∑_{u=1}^n|X_{iu}-X_{ju}|^p)^{\frac{1}{p}} distmk(Xi,Xj)=(u=1∑n∣Xiu−Xju∣p)p1
其中,n表示样本的维度。
K-means聚类是最为简单的一种聚类方式,假设聚类结果一共有k个簇, u i u_i ui表示第i个簇的中心点,我们的目标是最小化平方误差:
E = ∑ i = 1 k ∑ X ∈ C i ∣ ∣ X − u i ∣ ∣ 2 E=∑_{i=1}^k∑_{X∈C_i}||X-u_i||^2 E=i=1∑kX∈Ci∑∣∣X−ui∣∣2
也就是先对每一个簇下面的各个样本计算与中心的距离之和,然后在对所有簇求和。当距离达到最小的时候,意味着聚类的效果达到了最优。但是想要找到最小的距离值是一个NP问题,所以在K-means中采用了贪心算法,找到近似解。
注意:在K-means算法,唯一的参数是指定的分成簇的个数K。
在上述描述的K-means算法中,所有的样本初始的时候都是没有类标签的,也就是K-means是一种完全监督的学习。在LVQ算法中,假设数据样本时带有类别的标签的,学习的过程会利用这些标签信息来辅助进行聚类。
在LVQ算法中,样本集合D的形式如下:
D = { ( X 1 , Y 1 ) , ( X 2 , Y 2 ) , . . . . , ( X m , Y m ) } D=\{(X_1,Y_1),(X_2,Y_2),....,(X_m,Y_m)\} D={(X1,Y1),(X2,Y2),....,(Xm,Ym)}
其中 Y i Y_i Yi表示样本 X i X_i Xi的类别标签。每一个样本的维度为n,也就是 X i = [ X i 1 , X i 2 , . . . , X i n ] X_i=[X_{i1},X_{i2},...,X_{in}] Xi=[Xi1,Xi2,...,Xin]
LVQ的目标:
LVQ学习的目标是学习出各个簇的表示向量 p 1 , p 2 , . . . , p k {p_1,p_2,...,p_k} p1,p2,...,pk,一共有k个簇,每一个 p i p_i pi的维度为n。
首先,我们对各个簇的表示向量 p i p_i pi进行随机初始化。并且给这些向量分配k个标签,用于后续的计算。记为 [ t 1 , t 2 , . . . , t k ] [t_1,t_2,...,t_k] [t1,t2,...,tk]
训练的过程是一个迭代的过程,随机从样本集合中抽取一个样本 ( X i , Y i ) (X_i,Y_i) (Xi,Yi),分别计算其和每一个簇的表示向量的的距离, d j i = ∣ ∣ X i − p j ∣ ∣ 2 d_{ji}=||X_i-p_j||^2 dji=∣∣Xi−pj∣∣2,找到距离最小的 p j p_j pj,将 Y i Y_i Yi和 p j p_j pj的标签进行比较,如果两个标签相同,则有新的 p j p_j pj为:
p j n e w = p j + η ∗ ( X i − p j ) p_j^{new}=p_j+η*(X_i-p_j) pjnew=pj+η∗(Xi−pj)
否则:
p j n e w = p j − η ∗ ( X i − p j ) p_j^{new}=p_j-η*(X_i-p_j) pjnew=pj−η∗(Xi−pj)
在上面的描述中,我们给出了两个簇的表示向量的更新公式:
如果两个标签相同,则有新的 p j p_j pj为:
p j n e w = p j + η ∗ ( X i − p j ) p_j^{new}=p_j+η*(X_i-p_j) pjnew=pj+η∗(Xi−pj)
否则:
p j n e w = p j − η ∗ ( X i − p j ) p_j^{new}=p_j-η*(X_i-p_j) pjnew=pj−η∗(Xi−pj)
我们来简单的分析一下,当标签相同的时候,更新后的 p j n e w p_j^{new} pjnew与样本 X i X_i Xi的距离为:
∣ ∣ X i − p j n e w ∣ ∣ 2 = ∣ ∣ X i − p j − η ∗ ( X i − p j ) ∣ ∣ 2 = ( 1 − η ) ∣ ∣ X i − p j ∣ ∣ 2 ||X_i-p_j^{new}||_2=||X_i-p_j-η*(X_i-p_j)||_2=(1-η)||X_i-p_j||_2 ∣∣Xi−pjnew∣∣2=∣∣Xi−pj−η∗(Xi−pj)∣∣2=(1−η)∣∣Xi−pj∣∣2
其中η∈[0,1],所以可以判断出距离变小,也就是 p j p_j pj更加接近于 X i X_i Xi。
当标签不同的时候:
∣ ∣ X i − p j n e w ∣ ∣ 2 = ∣ ∣ X i − p j + η ∗ ( X i − p j ) ∣ ∣ 2 = ( 1 + η ) ∣ ∣ X i − p j ∣ ∣ 2 ||X_i-p_j^{new}||_2=||X_i-p_j+η*(X_i-p_j)||_2=(1+η)||X_i-p_j||_2 ∣∣Xi−pjnew∣∣2=∣∣Xi−pj+η∗(Xi−pj)∣∣2=(1+η)∣∣Xi−pj∣∣2
可以判断出距离变大,也就是 p j p_j pj更加疏远于 X i X_i Xi。
训练结束之后,我们就获得了最终的所有簇的向量表示 p 1 , p 2 , . . . , p k {p_1,p_2,...,p_k} p1,p2,...,pk,下一步就可以利用这些簇的表示对其他的样本空间,根据距离进行划分。