上一篇文章,我们讲的期望最大化(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 ( x i , x j ) = ∑ k = 1 m ( x k i − x k j ) 2 = ∣ ∣ x i − x j ∣ ∣ 2 2 d(x_i, x_j) = \sum^m_{k=1}(x_{ki}-x_{kj})^2=||x_i-x_j||^2_2 d(xi,xj)=k=1∑m(xki−xkj)2=∣∣xi−xj∣∣22
然后定义样本与所属类的中心之间的距离的总和为损失函数:
W ( C ) = ∑ l = 1 k ∑ C ( i ) = 1 ∣ ∣ x i − x ˉ l ∣ ∣ 2 2 W(C) = \sum^k_{l=1}\sum_{C(i)=1}||x_i-\bar x_l||^2_2 W(C)=l=1∑kC(i)=1∑∣∣xi−xˉl∣∣22
x ˉ l = ( x ˉ 1 l , x ˉ 2 l , . . . , x ˉ m l ) T \bar x_l=(\bar x_{1l},\bar x_{2l},...,\bar x_{ml})^T xˉl=(xˉ1l,xˉ2l,...,xˉml)T是第 l l l个类的均值或者中心, n l = ∑ i = 1 n I ( C ( i ) = l ) n_l=\sum_{i=1}^n I(C(i)=l) nl=∑i=1nI(C(i)=l), I ( C ( i ) = l ) I(C(i)=l) I(C(i)=l)是指示函数,第i个样本属于类别 l l l时取1,否则取0。W© 衡量了相同类别的样本的相似程度。
k-means算法就是求出最佳的k,使得各个类别内的样本相似度尽可能的高:
C ∗ = arg min C W ( C ) = arg min C ∑ l = 1 k ∑ C ( i ) = 1 ∣ ∣ x i − x ˉ l ∣ ∣ 2 2 C^* = \arg\min\limits_{C}W(C) =\arg\min\limits_{C}\sum^k_{l=1}\sum_{C(i)=1}||x_i-\bar x_l||^2_2 C∗=argCminW(C)=argCminl=1∑kC(i)=1∑∣∣xi−xˉl∣∣22
虽然上述目标函数的最优化可以达到聚类的目的,但是n个样本划分到k个类别,可能的划分方案的个数是指数级别的,难以求解。
为此,k均值聚类算法采用迭代的方式达到聚类的效果,每次迭代包含两个步骤:
- 随机生成或者选择k个样本作为聚类中心,将每个样本分配到最近的中心,得到一个聚类结果。
- 计算每个类内所有样本的均值,作为这个类别新的聚类中心。
- 重复1,2直到聚类结果不再发生变化。
迭代过程如下面的动图所示:
具体过程如下:
首先,对于给定的k个中心 ( m 1 , m 2 , . . . , m k ) (m_1, m_2,...,m_k) (m1,m2,...,mk),求一个划分C,每个样本划分到一个类中,使得样本和所属类的中心之间的距离总和最小,即下面的式子极小化:
W ( C ) = min C ∑ l = 1 k ∑ C ( i ) = l ∣ ∣ x i − m l ∣ ∣ 2 2 W(C)=\min\limits_C\sum_{l=1}^k\sum_{C(i)=l}||x_i-m_l||^2_2 W(C)=Cminl=1∑kC(i)=l∑∣∣xi−ml∣∣22
然后,对给定的划分C或者说在类中心确定的情况下,再求各个类的中心 ( m 1 , m 2 , . . . , m k ) (m_1, m_2,...,m_k) (m1,m2,...,mk),使得各个样本到这个中心的距离之和最小,一般要求的这个中心就是各个类别内样本的均值。这个过程描述如下:
W ( C ) = min m 1 , . . . , m k ∑ l = 1 k ∑ C ( i ) = l ∣ ∣ x i − m l ∣ ∣ 2 2 W(C)=\min\limits_{m_1,...,m_k}\sum_{l=1}^k\sum_{C(i)=l}||x_i-m_l||^2_2 W(C)=m1,...,mkminl=1∑kC(i)=l∑∣∣xi−ml∣∣22
对于包含了 n l n_l nl个样本的 C l C_l Cl,更新其均值 m l m_l ml。也就是说,具体求新的中心的过程如下:
m l = 1 n l ∑ C ( i ) = l x i , l = 1 , 2 , . . . k m_l = \frac{1}{n_l}\sum_{C(i)=l}x_i, l=1,2,...k 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 ) P(y|\theta)=\sum\limits^{K}_{k=1}\alpha_k\phi(y|\theta_k) P(y∣θ)=k=1∑Kαkϕ(y∣θk)
其中, α k \alpha_k αk是系数, α k ≥ 0 \alpha_k\ge0 αk≥0, ∑ k = 1 K α k = 1 \sum\limits^{K}_{k=1}\alpha_k=1 k=1∑Kαk=1, ϕ ( y ∣ θ k ) \phi(y|\theta_k) ϕ(y∣θk) 是高斯分布密度, θ k = ( μ k , σ k 2 ) \theta_k=(\mu_k,\sigma_k^2) θk=(μk,σk2)
ϕ ( y ∣ θ k ) = 1 2 π σ k exp ( − ( y − μ k ) 2 2 σ k 2 ) \phi(y|\theta_k)=\frac{1}{\sqrt{2\pi}\sigma_k}\exp\left(-\frac{(y-\mu_k)^2}{2\sigma_k^2}\right) ϕ(y∣θk)=2πσk1exp(−2σk2(y−μk)