本文是周志华《机器学习》第九章的学习笔记。
“无监督学习”通过对无标记训练样本的学习来揭示数据的内在性质及规律。通常,“无监督学习”包含的任务类型有“聚类”、“密度估计”、“异常检测”等,下述将主要对“聚类”进行讨论。
(1)“聚类”任务可以作为一个单独过程,也可以作为分类等其他学习任务的前去过程,即根据聚类结果将每个“簇”定义为一个“类”,然后基于这些类训练分类模型。(2)“聚类”任务中使用的样本可以带有标签,也可以不带标签。对无标签样本进行聚类,其数学语言描述如下:假定样本集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm}包含mm个无标记样本,每个样本是一个nn维特征向量,则聚类算法将样本集划分成kk个互斥且完备的簇,即Cl′⋂l′≠lCl=∅Cl′⋂l′≠lCl=∅,且D=⋃kl=1ClD=⋃l=1kCl。用λj∈{1,2,⋯,k}λj∈{1,2,⋯,k}表示样本xjxj的“簇标记”,即xj∈Cλjxj∈Cλj。则样本集DD对应的聚类结果可表示为。
性能度量 |
聚类算法的预期目标是“簇内相似度”高,“簇间相似度”低。通过“性能度量”评估聚类结果好坏,将“性能度量”作为“聚类过程优化的目标”。聚类性能度量主要有两大类:(1)外部指标:将聚类结果与某个“参考模型”进行比较;(2)内部指标:直接参考聚类结果而不利用
外部指标:
对数据集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm}的簇划分={C1,C2,⋯,Ck}C={C1,C2,⋯,Ck}参考模型给出的簇划分∗={C∗1,C∗2,⋯,C∗k}C∗={C1∗,C2∗,⋯,Ck∗},且λλ表示C对应的簇标记向量、λ∗λ∗表示∗C∗对应的簇标记向量,则可定义
- Jaccard系数:JC=aa+b+cJC=aa+b+c
- FM指数:FMI=aa+b⋅aa+c‾‾‾‾‾‾‾‾‾‾‾‾‾√FMI=aa+b⋅aa+c
- Rand指数:RI=2(a+d)m(m−1)RI=2(a+d)m(m−1)
其中,JC,FMI,RI∈[0,1]JC,FMI,RI∈[0,1],且值越大代表聚类效果越好。
内部指标:
根据对数据集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm}的簇划分={C1,C2,⋯,Ck}C={C1,C2,⋯,Ck},定义
上式中dist(⋅,⋅)dist(⋅,⋅)计算两样本间的距离,μμ代表簇CC的中心点。
- DB指数:DBI=1k∑i=1kmaxj≠i(avg(Ci)+avg(Cj)dcen(μi,μj))DBI=1k∑i=1kmaxj≠i(avg(Ci)+avg(Cj)dcen(μi,μj))
- Dunn指数:DI=min1≤i≤k{minj≠i(dmin(Ci,Cj)max1≤l≤kdiam(Cl))}DI=min1≤i≤k{minj≠i(dmin(Ci,Cj)max1≤l≤kdiam(Cl))}
距离计算 |
满足非负性、对称性、传递性的基本度量距离,即L1,L2,Lp范数:
“连续属性”:在定义域上有无穷多个可能的取值
“离散属性”:在定义域上是有限个取值
“有序属性”:在该属性上定义了“序”关系,如{1,2,3}{1,2,3}里“11”与“”比较接近,与“33”相距较远。
“无序属性”:如这样的离散属性即为无序属性。
可以直接在有序属性上计算距离,但不能直接在无序属性上计算距离。
(1)无序属性可利用VDM距离度量:
- VDMp(a,b)=∑i=1k∣∣∣mu,a,imu,a−mu,b,imu,b∣∣∣pVDMp(a,b)=∑i=1k|mu,a,imu,a−mu,b,imu,b|p
上式中mu,amu,a表示在属性uu上取值为的样本数,mu,a,imu,a,i表示在第ii个簇中在属性上取值为aa的样本数,为簇数。
(2)混合属性(样本向量不同维度,既包含有序属性又包含无序属性)可将Minkowski(Lp范数)距离和VDM结合:
- MinkovDMp(xi,xj)=(∑u=1nc|xiu−xju|p+∑u=nc+1nVDMp(xiu,yju))1pMinkovDMp(xi,xj)=(∑u=1nc|xiu−xju|p+∑u=nc+1nVDMp(xiu,yju))1p
原型指样本空间里“具有代表性的点”,可通过一组原型刻画聚类结构。基于原型的聚类算法——对原型初始化,对原型迭代更新。
原型聚类——K-means |
“K均值”算法对样本集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm}聚类,得到的簇划分={C1,C2,⋯,Ck}C={C1,C2,⋯,Ck}对应的最小化平方误差:
EE刻画了簇内样本围绕簇均值向量的紧密程度,值越小表示簇内样本相似度越高。要想求EE的最优解,需要遍历考查样本集所有可能的簇划分,是NP难问题;实际操作中,常采用贪心策略,通过迭代优化近似求解。
- 输入:样本集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm};聚类簇数kk.
- 算法流程:
- (1)从里随机选kk个样本作为初始均值向量.
- (2)通过循环逐个生成簇,目标是生成kk个聚类簇:
- 对里每个样本xixi:
- a.)计算该样本与各均值向量μiμi的距离:dji=||xj−μi||2dji=||xj−μi||2,
- b.)对应可得样本μiμi所归属的簇标记λj=argmini∈{1,2,⋯,k}djiλj=argmini∈{1,2,⋯,k}dji,
- c.)把样本xixi加入簇Cλj=Cλj⋃xjCλj=Cλj⋃xj.
- 更新各个聚类簇的均值向量μ′i=1|Ci|∑x∈Cixμi′=1|Ci|∑x∈Cix ,
- 判断μ′iμi′与μiμi是否相等,相等则该聚类簇中心不变,不相等则更新为μ′iμi′.
- (3)重复以上过程(2),直到达到最大迭代次数限制;或对所有ii满足时,停止迭代.
原型聚类——学习向量量化LVQ LVQ算法里假设数据样本带有“类别标签”,簇划分过程需要记住“类别标签”辅助学习。即,对于给定的样本集D={(x1,y1),(x2,y2),⋯,(xm,ym)}D={(x1,y1),(x2,y2),⋯,(xm,ym)},nn维属性,样本xjxj的类标记yj∈yj∈Y。
LVQ的目标是学习到一组“代表各个聚类簇”的nn维原型向量,即原型向量和样本的属性具有相同的维度。由此,LVQ初始化第qq个簇的原型向量的一种方法:从类别标记为的样本里,随机选取一个“样本属性向量”作为“初始原型向量”。- 输入:样本集D={(x1,y1),(x2,y2),⋯,(xm,ym)}D={(x1,y1),(x2,y2),⋯,(xm,ym)};原型向量个数qq;各原型向量初始类别标记;学习率η∈(0,1)η∈(0,1).
- 算法流程:
- (1)从类别标记为ti(i=1,2,⋯,q)ti(i=1,2,⋯,q)的样本里,随机选取一个“样本属性向量”作为初始原型向量pi(i=1,2,⋯,q)pi(i=1,2,⋯,q);得初始化原型向量组{p1,p2,⋯,pq}{p1,p2,⋯,pq}.
- (2)遍历更新每个原型向量:
- 随机选取DD内的一个样本:
- a.)计算该样本与各个原型向量pi(i=1,2,⋯,q)pi(i=1,2,⋯,q)的距离:dji=||xj−pi||2dji=||xj−pi||2,
- b.)找出与xjxj距离最近的原型向量p∗ipi∗,i∗=argmini∈{1,2,⋯,q}djii∗=argmini∈{1,2,⋯,q}dji,
- c.)更新原型向量:如yj=t∗iyj=ti∗,则p′=p∗i+η⋅(xj−p∗i)p′=pi∗+η⋅(xj−pi∗)(原型向量靠近xjxj);否则,p′=p∗i−η⋅(xj−p∗i)p′=pi∗−η⋅(xj−pi∗)(原型向量远离xjxj).
- (3)重复以上过程(2),直到达到最大迭代次数限制;或“原型向量”更新很小甚至不更新时,停止迭代.
原型聚类——高斯混合聚类 高斯混合聚类采用“概率模型”来表达聚类原型,定义高斯混合分布
p(x)=∑i=1kαi⋅p(x|μi,Σi)=∑i=1kαi⋅1(2π)n2|Σi|12e−12(x−μi)TΣ−1i(x−μi)pM(x)=∑i=1kαi⋅p(x|μi,Σi)=∑i=1kαi⋅1(2π)n2|Σi|12e−12(x−μi)TΣi−1(x−μi)
上式,μiμi是第ii个高斯混合成分的维均值矩阵;ΣiΣi是第ii个高斯混合成分的维协方差矩阵;αi>0αi>0是第ii个高斯混合成分的“混合系数”,且。样本生成过程:根据“混合系数”定义的先验分布,选择该样本所属的高斯混合成分(其中αiαi是选择第ii个高斯混合成分的概率),根据被选择的高斯混合成分的“概率密度函数”进行“采样”,从而生成相应的样本。
定义随机变量表示生成样本xjxj的高斯混合成分,则zjzj的先验概率P(zj=i)=αiP(zj=i)=αi,由贝叶斯公式zjzj的后验分布
p(zj=i|xj)=P(zj=i)⋅p(xj|zj=i)p(xj)=αi⋅p(xj|μi,Σi)∑l=1kαl⋅p(xj|μl,Σl)≜γjipM(zj=i|xj)=P(zj=i)⋅pM(xj|zj=i)pM(xj)=αi⋅p(xj|μi,Σi)∑l=1kαl⋅p(xj|μl,Σl)≜γji
(1)若模型参数已知,即模型确定时,将样本集DD划分为个簇={C1,C2,⋯,Ck}C={C1,C2,⋯,Ck}的方法:每个样本xjxj的簇标记λj=argmaxi∈{1,2,⋯,k}γjiλj=argmaxi∈{1,2,⋯,k}γji。
(2)模型参数{(αi,μi,Σi)|1≤i≤k}{(αi,μi,Σi)|1≤i≤k}利用“极大似然估计求导和EM算法迭代”学习:
LL(D)=ln(∏j=1mp(xj))=ln(∏j=1m(∑i=1kP(zj=i)⋅p(xj|zj=i)))=ln(∏j=1m(∑i=1kαi⋅p(xj|μi,Σi)))=∑j=1mln(∑i=1kαi⋅p(xj|μi,Σi))LL(D)=ln(∏j=1mpM(xj))=ln(∏j=1m(∑i=1kP(zj=i)⋅pM(xj|zj=i)))=ln(∏j=1m(∑i=1kαi⋅p(xj|μi,Σi)))=∑j=1mln(∑i=1kαi⋅p(xj|μi,Σi))
由∂LL(D)∂μi=0∂LL(D)∂μi=0可求得μi=∑j=1mγjixj∑j=1mγjiμi=∑j=1mγjixj∑j=1mγji;由∂LL(D)∂Σi=0∂LL(D)∂Σi=0可求得Σi=∑j=1mγji(xj−μi)(xj−μi)T∑j=1mγjiΣi=∑j=1mγji(xj−μi)(xj−μi)T∑j=1mγji;将约束αi>0,∑i=1kαi=1αi>0,∑i=1kαi=1转化成Lagrange乘子后求导,即∂(LL(D)+λ(∑i=1kαi−1))∂αi=0∂(LL(D)+λ(∑i=1kαi−1))∂αi=0,可求得αi=1m∑j=1mγjiαi=1m∑j=1mγji。- 输入:样本集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm};高斯混合成分个数kk.
- 算法流程:
- (1)初始化高斯混合分布的模型参数.
- (2)遍历更新每个样本:
- 根据贝叶斯公式,计算每个样本xjxj由各高斯混合成分生成的后验概率γji=p(zj=i|xj),(1≤i≤k)γji=pM(zj=i|xj),(1≤i≤k).
- (3)更新每个高斯混合成分的参数:
- a.)计算新均值向量μ′i=∑j=1mγjixj∑j=1mγjiμi′=∑j=1mγjixj∑j=1mγji,
- b.)计算新协方差矩阵Σ′i=∑j=1mγji(xj−μi)(xj−μi)T∑j=1mγjiΣi′=∑j=1mγji(xj−μi)(xj−μi)T∑j=1mγji,
- c.)计算新混合系数α′i=1m∑j=1mγjiαi′=1m∑j=1mγji.
- (4)根据后验概率γjiγji,对每个样本确定簇标记λj=argmaxi∈{1,2,⋯,k}γjiλj=argmaxi∈{1,2,⋯,k}γji,则第CλjCλj个簇更新为Cλj=Cλj⋃{xj}Cλj=Cλj⋃{xj}.
密度聚类 此类方法通过“样本分布的紧密程度”确定聚类结构。即,从样本密度角度考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇,以获得最终的聚类结果。
密度聚类算法DBSCAN
该算法是对给定的数据集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm},基于一组“邻域”参数(ϵ,MinPts)(ϵ,MinPts),刻画样本分布的紧密程度。首先,给出如下定义:
(1)ϵ−ϵ−邻域:xj∈Dxj∈D的ϵ−ϵ−邻域指该邻范围内包含的所有其余样本点集合,Nϵ(xj)={xi∈D|dist(xi,xj)≤ϵ}Nϵ(xj)={xi∈D|dist(xi,xj)≤ϵ}.
(2)核心对象:某样本xjxj是核心样本,指其ϵ−ϵ−邻域内至少包含MinPtsMinPts个样本点,即|Nϵ(xj)|≥MinPts|Nϵ(xj)|≥MinPts.
(3)密度直达:xjxj是核心对象xixi的ϵ−ϵ−邻域内的点,称xjxj由xixi密度直达.
(4)密度可达:若有样本序列xi=p1,p2,⋯,pn=xjxi=p1,p2,⋯,pn=xj,且后一样本点pi+1pi+1由前一样本点pipi密度直达,则xjxj由xixi密度可达.
(5)密度相连:若样本点xixi和xjxj均由xkxk密度可达,则xixi和xjxj密度相连.
DBSCAN算法的“簇”是由密度可达导出的“最大”密度相连的“样本的集合”。若xx为核心对象,由xx密度可达的所有样本组合的集合,即形成一个聚类簇。最后,簇划分确定后,数据集DD中不属于任何簇的样本,通常看作“噪声”或“异常样本”。- 输入:样本集;邻域参数(ϵ,MinPts)(ϵ,MinPts).
- 算法流程:
- (1)初始化核心对象集合Ω=∅Ω=∅.
- (2)遍历每个样本,确定该样本是否是核心对象:
- 对于样本xjxj,若|Nϵ(xj)|≥MinPts|Nϵ(xj)|≥MinPts,则该样本是核心对象,更新Ω=Ω⋃{xj}Ω=Ω⋃{xj}.
- (3)根据核心对象的密度可达关系,确定每一个聚类簇:
- a.)随机选取一个核心对象初始化队列QQ,初始化未访问样本集,
- b.)取QQ的首个元素,考查其邻域内的样本点是否已被划分到某个簇:若未被划分到某个簇,则加入当前簇;若已被划分到某个簇,则continue,
- c.)考查该邻域内的样本点是否是核心对象:如果是,则进一步根据密度可达关系扩张,获得外围样本点,回到b.)进一步考察;如果不是,则停止.
层次聚类 层次聚类是在“不同层次”对数据集进行划分,形成“树形的聚类结构”。数据集的划分方式:(1)“自底向上”聚合(2)“自顶向下”分拆。
AGNES自底向上聚合的层次聚类算法
该算法初始将每个样本看成一个聚类簇,每一步对“距离最近的两个聚类簇”合并,重复以上过程直到达到预设的聚类簇个数。
计算聚类簇间距离的不同定义:
最小距离:dmin(Ci,Cj)=minx∈Ci,z∈Cjdist(x,z)最大距离:dmax(Ci,Cj)=maxx∈Ci,z∈Cjdist(x,z)平均距离:davg(Ci,Cj)=1|Ci||Cj|∑x∈Ci∑z∈Cjdist(x,z)最小距离:dmin(Ci,Cj)=minx∈Ci,z∈Cjdist(x,z)最大距离:dmax(Ci,Cj)=maxx∈Ci,z∈Cjdist(x,z)平均距离:davg(Ci,Cj)=1|Ci||Cj|∑x∈Ci∑z∈Cjdist(x,z)- 输入:样本集D={x1,x2,⋯,xm}D={x1,x2,⋯,xm};聚类簇聚类度量函数dd;聚类簇数.
- 算法流程:
- (1)初始化,每个样本作为一个聚类簇Cj={xj},j=1,2,⋯,mCj={xj},j=1,2,⋯,m.
- (2)遍历每个样本,计算距离矩阵:
- 对于任意两个样本,计算距离,得距离矩阵M(i,j)=d(Ci,Cj),M(i,j)=M(j,i),j>iM(i,j)=d(Ci,Cj),M(i,j)=M(j,i),j>i.
- (3)若聚类簇个数大于预计聚类簇数,则合并距离最近的两个聚类簇,更新距离矩阵:
- a.)找到距离最近的两个聚类簇Ci∗Ci∗和Cj∗Cj∗,合并得Ci∗=Ci∗⋃Cj∗Ci∗=Ci∗⋃Cj∗,
- b.)对编号在j∗j∗后的聚类簇重新编号,即编号往前减1,
- c.)删除距离矩阵的第j∗j∗行和第j∗j∗列,对新划分的聚类簇计算距离矩阵.
- (4)重复以上过程(3),直到聚类簇聚合到预期聚类簇数,停止迭代.