上一篇文章,我们讲的期望最大化(EM)算法是一种非常强大的算法,应用于数据科学的许多场景。k-means是该算法非常简单且易于理解的一个应用。
k-means聚类
k均值聚类算法(k-means)将样本集合划分为k个子集,也就是将n个样本划分到k个类别中,每个样本到类别的中心距离最近。
EM角度的理解
如果从EM角度来理解的话,k均值聚类算法的隐变量是聚类的中心,模型的参数是每个数据点属于哪个分类。k-means算法描述如下:
(1)选择初始聚类中心
(2)E步:将样本分配到距离最近的中心形成簇
(3)M步:将簇的中心设置为簇内各个样本的均值
(4)重复(2)(3)直到收敛
E步就是估计隐含类别y的期望值,M步调整其他参数使得在给定类别y的情况下,极大似然估计P(x,y)能够达到极大值。然后在其他参数确定的情况下,重新估计y,周而复始,直至收敛。
算法流程
k-means可以采用欧式距离的平方作为样本之间的距离度量:
d(xi,xj)=k=1∑m(xki−xkj)2=∣∣xi−xj∣∣22
然后定义样本与所属类的中心之间的距离的总和为损失函数:
W(C)=l=1∑kC(i)=1∑∣∣xi−xˉl∣∣22
xˉl=(xˉ1l,xˉ2l,...,xˉml)T是第l个类的均值或者中心,nl=∑i=1nI(C(i)=l),I(C(i)=l)是指示函数,第i个样本属于类别l时取1,否则取0。W© 衡量了相同类别的样本的相似程度。
k-means算法就是求出最佳的k,使得各个类别内的样本相似度尽可能的高:
C∗=argCminW(C)=argCminl=1∑kC(i)=1∑∣∣xi−xˉl∣∣22
虽然上述目标函数的最优化可以达到聚类的目的,但是n个样本划分到k个类别,可能的划分方案的个数是指数级别的,难以求解。
为此,k均值聚类算法采用迭代的方式达到聚类的效果,每次迭代包含两个步骤:
- 随机生成或者选择k个样本作为聚类中心,将每个样本分配到最近的中心,得到一个聚类结果。
- 计算每个类内所有样本的均值,作为这个类别新的聚类中心。
- 重复1,2直到聚类结果不再发生变化。
迭代过程如下面的动图所示:

具体过程如下:
首先,对于给定的k个中心(m1,m2,...,mk),求一个划分C,每个样本划分到一个类中,使得样本和所属类的中心之间的距离总和最小,即下面的式子极小化:
W(C)=Cminl=1∑kC(i)=l∑∣∣xi−ml∣∣22
然后,对给定的划分C或者说在类中心确定的情况下,再求各个类的中心(m1,m2,...,mk),使得各个样本到这个中心的距离之和最小,一般要求的这个中心就是各个类别内样本的均值。这个过程描述如下:
W(C)=m1,...,mkminl=1∑kC(i)=l∑∣∣xi−ml∣∣22
对于包含了nl个样本的Cl,更新其均值ml。也就是说,具体求新的中心的过程如下:
ml=nl1C(i)=l∑xi,l=1,2,...k
重复上面的步骤,直到划分不再改变,就得到了聚类的结果。
特点
k均值聚类算法的总体特点:
- 是基于划分的聚类方法
- 类别k事先指定
- 以欧式距离平方作为距离的度量方式
- 以中心或者样本的均值表示类别
- 以样本和所属的类的中心的距离之和作为目标函数
- 算法是迭代算法,不能保证得到全局最优。
k均值聚类算法属于启发式方法,不能保证达到全局最优,受到初始中心的很大影响。
关于初始中心的选择,可以先用层次聚类对样本进行聚类,得到k个类别后,再从k个类别中选取一个与中心距离最近的点。
k值选择
关于类别数k的选择,在实际应用中需要尝试不同的k值,检验聚类结果的质量。聚类结果可以用类别的平均直径来衡量。

如上图所示,一般地,类别数量变大时,类别平均直径会变小,当类别数量超过某个值后,平均直径不再改变,这个值就是最优的k值。
局限性
不过,k-means聚类也有比较明显的局限性。当各个样本的分布接近圆形(球形)的时候,效果还不错:

但是,当各个样本的分布不那么“圆”的时候,聚类效果就打折扣了:

因此,我们需要一种不同的方法来为数据点分配聚类。因此,我们将不再使用基于距离的模型,而是使用基于分布的模型。效果如下:

下面要介绍的高斯混合模型就是基于分布的模型。
高斯混合模型
GMM的问题描述
高斯混合模型(GMM)假设存在一定数量的高斯分布,每个分布代表一个簇。因此,高斯混合模型倾向于将属于单一分布的数据点聚在一起。
高斯混合模型的数学公式:
P(y∣θ)=k=1∑Kαkϕ(y∣θk)
其中,αk是系数,αk≥0,k=1∑Kαk=1, ϕ(y∣θk) 是高斯分布密度,θk=(μk,σk2)
ϕ(y∣θk)=2πσk1exp(−2σk2(y−μk)2)
上式表示第k个分模型。
GMM的数学公式在形式上可以看成是高斯分布概率密度函数(PDF)的加权求和:
∑(权重×分布密度)=分布
书中描述的是一维的高斯混合模型,d维的形式如下[^2],被称作多元正态分布,也叫多元高斯分布
ϕ(y∣θk)=(2π)d∣Σ∣1exp(−2(y−μk)TΣ−1(y−μk))
其中,Σ∈Rn×n是协方差矩阵。
已知观测数据y1,y2,…,yN,由高斯混合模型生成:
P(y∣θ)=k=1∑Kαkϕ(y∣θk)=j=1∏Nk=1∑Kαkϕ(yj∣θk)
其中, θ=(α1,α2,…,αK;θ1,θ2,…,θK),我们要做的是使用EM算法估计GMM的参数θ。
1,明确隐变量
观测数据yj,j=1,2,…,N的产生方式:
- 依概率αk选择第k个高斯分布分模型ϕ(y∣θk);
- 依第k个分模型的概率分布ϕ(y∣θk)生成观测数据yj
但是,反映观测数据yj来自第k个分模型的数据是未知的, k=1,2,…,K 这里用**隐变量γjk**表示:
γjk={1,0,第j个观测来自第k个分模型否则j=1,2,…,N;k=1,2,…,K;γjk∈{0,1}
γjk的维度为(j×k),每一行都是一种one-hot的形式,表示对于观测数据j,在γjk的第j行的第k列为1,该行其余的列都为0。
完全数据为(yj,γj1,γj2,…,γjK,k=1,2,…,N),完全数据的似然函数为:
P(y,γ∣θ)====j=1∏NP(yj,γj1,γj2,…,γjK∣θ)k=1∏Kj=1∏N[αkϕ(yj∣θk)]γjkk=1∏Kαknkj=1∏N[ϕ(yj∣θk)]γjkk=1∏Kαknkj=1∏N[2πσk1exp(−2σ2(yj−μk)2)]γjk(1)
其中nk=∑j=1Nγjk,∑k=1Knk=N。nk是所有行第k列的和,可以理解为属于第k个高斯分布的样本的个数。
下面求完全数据对数似然函数:
我们假设上面似然函数的式子(1)中,∏j=1N[2πσk1exp(−2σk2(yj−μk)2)]γjk=ωk
则:
logP(y,γ∣θ)=logk=1∏Kαknkωk=k=1∑K(nklogαk+logωk)
其中logωk展开为:
logωk=logj=1∏N[2πσk1exp(−2σk2(yj−μk)2)]γjk=j=1∑Nγjk(log2π1−logσk−2σk2(yj−μk)2)
所以完全数据的对数似然函数为:
logP(y,γ∣θ)=k=1∑K{nklogαk+j=1∑Nγjk[log(2π1)−logσk−2σ21(yj−μk)2]}
2、EM算法的E步:确定Q函数
下面的Q 函数是完全数据的对数似然函数logP(y,γ∣θ)关于给定观测数据y的当前参数θ(i)下,对未观测数据γ的条件概率分布P(γ∣y,θ(i))的期望表达式:
Q(θ,θ(i))=====E[logP(y,γ∣θ)∣y,θ(i)]E{k=1∑K{nklogαk+j=1∑Nγjk[log(2π1)−logσk−2σ2(yj−μk)21]}}(1)k=1∑K{E{nklogαk+j=1∑Nγjk[log(2π1)−logσk−2σ2(yj−μk)21]}}(2)k=1∑K{E{j=1∑Nγjklogαk+j=1∑Nγjk[log(2π1)−logσk−2σ2(yj−μk)21]}}(3)k=1∑K{j=1∑N(Eγjk)logαk+j=1∑N(Eγjk)[log(2π1)−logσk−2σ2(yj−μk)21]}(4)
说明:
(1)到(2)是因为期望的基本性质:和的期望等于期望的和。
(2)到(3)是因为nk=∑j=1Nγjk。
(3)到(4)是因为Q函数是完全数据的对数似然函数对隐变量的条件概率分布。
上面的式子需要对隐变量γjk求期望(记为γ^jk),与隐变量无关的项可以视为常数:
γ^jk=E(γjk∣yj,θ)=P(γjk=1∣yj,θ)=P(yj,θ)P(γjk=1,yj,θ)=P(yj∣θ)P(θ)P(γjk=1,yj∣θ)P(θ)=P(yj∣θ)P(γjk=1,yj∣θ)=∑k=1KP(γjk=1,yj∣θ)P(γjk=1,yj∣θ)=∑k=1KP(yj∣γjk=1,θ)P(γjk=1∣θ)P(yj∣γjk=1,θ)P(γjk=1∣θ)=∑k=1Kαkϕ(yj∣θk)αkϕ(yj∣θk)
3. EM算法的E步
迭代的M步是求Q(θ,θ(i))对θ的极大值,得到新一轮迭代的模型参数:
θ(i+1)=argθmaxQ(θ,θ(i))
对Q(θ,θi)求导,可以得到未知量μk,σk^2的偏导,使其偏导等于0,求解得到:
μk^=∑j=1Nγjk^∑j=1Nγjk^yiσk^2=∑j=1Nγjk^∑j=1Nγjk^(yi−μk)2
对于ak^而言,它是属于各个分布的样本个数的占比:
ak^=Nnk=N∑j=1Nγjk^
4. 停止条件
重复以上3,4的计算,直到对数似然函数值不再有明显的变化为止。