版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/84331625
0. 前言
原本计计划用两个早晨看完这一章节的,没想到竟然很顺利的只用了一早上就看完了。所以在此也跟各位同道中的小伙伴们分享一下,千万不要觉得这些知识枯燥,没有现成的算法直接使用起来那么爽,那么有成就感,但是掌握这些算法的原理却是我们在今后使用这些算法的根基,根基不稳,终究也就只是个调包怪罢了。认真看进去的话,收获非常大,且触类旁通,对于你在别的领域,或许也会有些许的启迪。
1. 聚类的性能度量和距离计算
聚类任务是“无监督学习”中研究最多、应用最广的。聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个"簇"(cluster)。
1.1 性能度量
聚类性能度量大致有两类. 一类是将聚类结果与某个"参考模型" (reference model)进行比较,称为"外部指标" (external i丑dex); 另一类是直接考察聚类结果而不利用任何参考模型,称为"内部指标" (internal
index)。
其中:
a
: 表示在聚类模型和参考模型中都属于同一簇的样本对
b
: 表示在聚类模型中属于同一簇,但在参考模型中不属于同一簇的样本对
c
: 表示在参考模型中属于同一簇,但在聚类模型中不属于同一簇的样本对
d
: 表示在聚类模型和参考模型中都不属于同一簇的样本对
这四个值的感觉其实跟混淆矩阵类似,都是用于判定聚类产生的簇的好坏。有了这四个的值,就可以求出以下的几个性能度量的外部指标:
Jaccard 系数(Jaccard Coefficient, JC):
JC=a+b+ca
FM 指数(Fowlkes and Mallows Index, FMI):
FMI=a+ba⋅a+ca
Rand 指数(Rand Index, RI):
RI=m(m−1)2(a+d)
上述性能度量的结果都在[0, 1]之间,其值越大越好。
聚类性能度量内部指标,考虑聚类结果的簇划分
C={c1,c2,...,ck},定义:
簇C内样本间的平均距离:avg(C)=∣C∣(∣C∣−1)21≤i≤j≤∣C∣∑dist(xi,xj)簇C内样本间的最远距离:diam(C)=1≤i≤j≤∣C∣maxdist(xi,xj)簇C内样本间的最近距离:dmin(Ci,Cj)=1≤i≤j≤∣C∣mindist(xi,xj)簇Ci与簇Cj中心点的距离:dcen(Ci,Cj)=dist(μi,μj)
DB 指数(Davies-Bouldin Index, DBI):
DBI=k1i=1∑kj̸=imax(dcen(μi,μj)avg(Ci)+avg(Cj))
Dunn指数(Dunn Index, DI):
DI=1≤i≤kmin{j̸=iminmax1≤l≤kdiam(Cl)dmin(Ci,Cj)}
其中,DBI的值越小越好,而DI则相反,值越大越好。
1.2 距离计算
给定样本
xi和
xj,通常使用闵可夫斯基距离来计算两个样本之间的距离:
∣∣xi−xj∣∣p=(u=1∑n∣xiu−xju∣p)p1
“闵氏距离”在数学上也称为p范数;
当p=2的时候,这时的距离就称之为“欧几里得距离”,就是我们常用的“欧式距离”:
∣∣xi−xj∣∣2=u=1∑n∣xiu−xju∣2
当p=1的时候,这时候的距离就称之为“曼哈顿距离”:
∣∣xi−xj∣∣1=u=1∑n∣xiu−xju∣
以上的距离计算方法是针对于数值型的数据,但是有些时候,数据集中往往会出现非数值型的特征,比如花的颜色如{红色, 黄色, 绿色}等,一般我们在处理这些非数值型的特征的时候,一般会先将其转化数值型的特征,然后再进行计算。但是书中给了我们另一种针对与非数值型数据计算的方法VDM(Value Difference Matric):
令
mu,a表示在属性u上取值为a的样本数,
mu,a,i 表示在第i个样本簇中在属性u上取值为a的样本数,k为样本簇数,则属性u上两个离散值a与b之间的VDM 距离为:
VDMp(a,b)=i=1∑k∣mu,amu,a,i−mu,bmu,b,i∣p
其实不难发现,式中的两个比值就是在第i个簇中属性u取值为a的样本数占所有样本中属性u取值为a的样本数的比例,然后使用这个比例来计算距离!
如果一个训练集中既有数值型特征,又有非数值型特征,就可以将闵氏距离和VDM结合起来:
MinkovDMp(xi,xj)=(u=1∑nc∣xiu−xju∣p+u=nc+1∑nVDMp(xiu−xju))p1
2. 原型聚类
原型聚类亦称"基于原型的聚类" (prototype~ based clustering)) 此类算法假设聚类结构能通过一组原型刻画,在现实聚类任务中极为常用。通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解。采用不同的原型表示、不同的求解方式,将产生不同的算法。
2.1 K-means
K-means顾名思义就是k均值算法,针对于所有的簇划分
C={C1,C2,...,Ck}最小化平方误差:
E=i=1∑kx∈Ci∑∣∣x−μi∣∣22
书上给出的算法如下:
其实简而言之就是以下的几个步骤:
[1]:设置簇类数k,并在训练集上随机选择k个样本作为初始的均值向量;
[2]:将训练集中的所有样本与这k个向量求距离,并将其归为距离最短的簇中去;
[3]:每个簇中的样本求均值,得出新的均值向量;
[4]:重复2、3步,直到到达最大迭代轮数或者最小调整阈值。
2.2 学习向量化LVQ(Learning Vector Quantization, LVQ)
LVQ也是试图找到一组原型向量来刻画聚类结构, 但与一般聚类算法不同的是,LVQ假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类。
给定样本集
D={(Xl,Yl),(X2,y2),...,(Xm,Ym)} , 每个样本的是由n个属性描述的特征向量
(xj1,xj2,...,xjn) ,
y∈Y是样本
xj的类别标记。LVQ的目标是学得一组n维原型向量
{p1,p2,...,pq},每个原型向量代表一个聚类簇,簇标记
ti∈Y。下面是LVQ的算法伪代码:
其实简而言之就是以下的几个步骤:
[1]:确定原型向量个数q,并随机选择q个原型向量,及其对应的类别标记;
[2]:从训练集中随机选择一个样本,并计算其与每一个原型向量之间的距离,找到距离最短的原型向量;
[3]:更新该原型向量;如果样本和该原型向量的标记相同,则做如下更新:
p′=p+η(xj−p)
如果样本和该原型向量的标记不相同,则做如下更新:
p′=p−η(xj−p)
其中,
η是学习率[0,1];
[4]:重复2,3步直到满足收敛条件如到达最大迭代轮数。
在第3步中的更新,其意义在于:若最近的原型向量p与样本的类别标记相同,则令p向样本的方向靠拢;若最近的原型向量p与样本的类别标记不相同,则令p向样本的方向远离。
【思考:】LVQ是需要样本标记来作为辅助聚类的,那么初始化原型向量则肯定不能选择样本标记一样的,否则这个聚类就没有什么意义了。所以这里我觉得原型向量的个数应该就是标记的类别个数,且在初始化的时候,应该尽量选择那些类别标记不一样的样本作为初始原型向量。
最后,LVQ训练出来的就是q个原型向量,新的样本进来之后与所有的原型向量进行距离计算,距离最近的原型向量所对应的样本标记就是新的样本的标记!
2.3 高斯混合聚类
与K-means和LVQ不同,高斯混合聚类采用概率模型来表达聚类原型。定义高斯混合分布:
PM(x)=i=1∑kαiP(x∣μi,Σi)
该分布由k个高斯分布混合而成,其中
μi和
Σi是每个高斯分布的均值和协方差;
αi称为“混合系数”,并且满足
∑i=1kαi=1。
若训练集
D=X1,X2,…,Xm由上述过程生成,令随机变量
Zj∈{1,2,...,k}表示生成样本
xj的高斯混合成分,其取值未知.显然
zj的先验概率
P(zj=i)对应于
αi(i=1,2,…,k)。根据贝叶斯定理,
zj的后验分布对应于:
γji=PM(zj=i∣xj)=PM(xj)P(zj=i)PM(xj∣zj=i)=∑l=1kαlP(xj∣μl,Σl)αiP(xj∣μi,Σi)
其中,上式中的概率可以这样求解:
P(xj∣μi,Σi)=p(xj)=(2π)2n∣Σ∣211e−21(xj−μi)TΣi−1(xj−μi))
所以到这里可以看出
γij其实是一个m*k的矩阵,其中m是样本的个数,k是
αi的数量。但是可能还是会有疑问,这些值我都没有该怎么求呢?别急,高斯混合聚类也是一个迭代过程,
αi,
μi,
Σi在最开始都会被初始化的。
最后高斯混合聚类会将样本划分为k个簇
C={C1,C2,...,Ck},每个样本的
xj的簇标记
λj为:
λj=argi∈{1,2,...,k}maxγij
其实就是选取最大的
γij。
给定样本集D,通常采用极大似然估计,使用EM算法进行对
αi,
μi,
Σi这三个变量进行迭代。先写出其对数似然:
LL(D)=ln(j=1∏mPM(xj))=j=1∑mln(i=1∑kαiP(xj∣μiΣi))
分别对
μi,
Σi求偏导数,并令其偏导数为0,在此之前,先对
P(xj∣μi,Σi)求偏导数,之后会用到:
∂μi∂P(xj∣μi,Σi)=(2π)2n∣Σ∣211e−21(xj−μi)TΣi−1(xj−μi))∗[(xj−μi)]=P(xj∣μi,Σi)(xj−μi)
对于
Σi求偏导数:
∂Σi∂P(xj∣μi,Σi)=(2π)2n1[∣Σ∣21e−21(xj−μi)TΣi−1(xj−μi)]′=(2π)2n12∣Σ∣
1e−21(xj−μi)TΣi−1(xj−μi)∗∣Σ∣221(xj−μi)T(xj−μi)∗∣Σ∣
−e−21(xj−μi)TΣi−1(xj−μi)∗2∣Σ∣
1=(2π)2n1[e−21(xj−μi)TΣi−1(xj−μi)∗∣Σ∣(xj−μi)T(xj−μi)−e−21(xj−μi)TΣi−1(xj−μi)]=∣Σ∣
P(xj∣μi,Σi)(xj−μi)T(xj−μi)−P(xj∣μi,Σi)∗∣Σ∣
=P(xj∣μi,Σi)(∣Σ∣
(xj−μi)T(xj−μi)−∣Σ∣
)
于是,我们分别用LL(D)对
μi,
Σi求偏导数有:
∂μi∂LL(D)=j=1∑m∑i=1kαiP(xj∣μi,Σi)αiP(xj∣μi,Σi)′=j=1∑m∑i=1kαiP(xj∣μi,Σi)αiP(xj∣μi,Σi)(xj−μi)=j=1∑mγij(xj−μi)=0
于是可以反解出
μi:
μi=∑j=1mγij∑j=1mγijxj
同理,我们继续对用LL(D)对
Σi求偏导数有:
∂Σi∂LL(D)=j=1∑m∑i=1kαiP(xj∣μi,Σi)αiP(xj∣μi,Σi)′=j=1∑m∑i=1kαiP(xj∣μi,Σi)αiP(xj∣μi,Σi)(∣Σ∣
(xj−μi)T(xj−μi)−∣Σ∣
)=j=1∑mγij(∣Σ∣
(xj−μi)T(xj−μi)−∣Σ∣
)=∣Σ∣∑j=1mγij((xj−μi)T(xj−μi)−∣Σ∣)=0
于是我们可以反解出
Σi:
Σi=∑j=1mγij∑j=1mγij(xj−μi)T(xj−μi)
对于
αi,我们使用LL(D)的拉格朗日形式有:
LL(D)+λ(i=1∑kαi−1)
此拉格朗日式对
αi求偏导数为并令其为零,于是有:
j=1∑m∑i=1kαiP(xj∣μi,Σi)αiP(xj∣μi,Σi)+λ=0
两边同时乘以
αi,有
λ=−m,故有:
αi=m1j=1∑mγij
ok,到了这里终于可以理解算法中的迭代部分是什么意思了:
其实简而言之就是以下的几个步骤:
[1]:设置簇个数k,初始化
αi,
μi,
Σi;
[2]:计算
γij矩阵;
[3]:根据
γij矩阵更新
αi,
μi,
Σi;
[4]:重复2,3步直到收敛(如最大迭代次数);
[5]:根据最大
γij将训练集划分到对应的簇中去。
对于新的样本,也是根据最大
γij划分到对应的簇中去。
3. 密度聚类 - DBSCAN算法
密度聚类亦称"基于密度的聚类" (density-based clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种著君的密度聚类算法,它基于一组"邻域" (neighborhood)参数(e,Minpts)来刻画样本分布的紧密程度.给定数据集D定义下面这几个概念:
基于这些概念, DBSCAN 将"簇"定义为:由密度可达关系导出的最大的密度相连样本集合.形式化地说,给定邻域参数(e,Minpts),簇C是满足以下性质的非空样本子集:
连接性(connectivity):
xi∈C,Xj∈C→xi与xj密度相连
最大性(maximality):
xi∈C,xj由xi密度可达→xj∈C
其实简而言之就是以下的几个步骤:
[1]:初始化邻域参数(e,Minpts),初始化核心对象集合为空;
[2]:遍历每一个样本,计算以其为核心对象时,其邻域中的样本数是够大于Minpts,如果是,则将该样本加入到核心对象集合中;
[3]:初始化聚类簇数k,初始化未访问的样本集合为所有样本;
[4]:进行循环运算直到核心对象集合为空:a.记录当前未访问的样本集合;b.随机选取一个核心对象,并初始化队列Q;c.从未访问样本中剔除该样本;d.反复计算,不断从未访问样本中剔除样本直到队列为空;
[5]:获取之前剔除的样本,组成一个簇;
[6]:从核心对象中剔除这个簇中的样本,返回第4步;
4. 层次聚类 - AGNES
层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集的划分可采用"自底向上"的聚合策略,也可采用"自顶向下" 的分拆策略。
AGNES(AGglomerative NESting)是一种采用自底向上聚合策略的层次聚类算法。它先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个粟类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数。这里的距离可以是最小距离,最大距离和平均距离:
其实简而言之就是以下的几个步骤:
[1]:选择距离度量函数d,聚类簇数k;
[2]:初始化单样本聚类簇,每个簇内都只有一个样本,即一个样本一个簇;
[3]:计算任意两个簇之间的距离;
[4]:进行循环运算直到满足收敛条件:a.合并两个距离最近的簇;b.将簇重新编号;c.重新计算任意两个簇之间的距离;
5. 写在最后
看完本章只用了一个早晨,但是写总结却花了两个晚上,尤其本章公式比较多,确实累的够呛。但是这对于新入门的小伙伴们来说确实非常有助于理解本章的算法及其原理,尤其是在高斯混合聚类一节中,书中并没有给出多少推导,所以我在推导部分写的非常详细,所以也非常推荐大家耐心阅读。所有的算法部分,我都用自己的语言,将算法的主干部分进行了梳理。
写总结这项工作非常的枯燥和耗时,很多时候写总结的时间都比看书所用的时间长,但是我相信有了这个工作我今后复习起来也会是非常的快!