K-Means算法简介
K-Means算法是一种常用的聚类算法,它认为由一组数据点构成的一个聚类中,聚类内部点之间的距离应该小于数据点与聚类外部的点之间的距离。假设我们有一组数据集
{x1,...,xN}
,我们的目标是将数据集划分为
K
个类别。为了解决这个问题,K-Means算法希望找到
为了形式化地说明这个问题,我们定义一些符号:(1)由于存在
K
个类别,则存在
为了求解这一聚类问题,我们设置“整个数据集点到各自聚类中心的距离的平方和”为目标函数,即 J=∑n∑kγnk(xn−μk)2 。最小化目标函数: argmin(γnk,μk)J(γnk,μk) 使得聚类效果最佳。
由于在目标函数中存在变量 {γnk,μk} ,同时求解是不可能的,我们采用一种迭代的方式来完成。
K-Means算法具体实现
其流程如下所示:
(1)初始化:为
{μk}
选取初值
(2)固定
{μk}
,关于
γnk
最小化目标函数
J
:
(2)固定各数据点类别,关于
{muk}
最小化目标函数
J
:
⇒μk=∑nγnkxn∑nγnk
K-Means迭代步骤与EM算法的关系:
(2)(3)中分别更新
γnk,μk
分别对应EM算法中的E步骤和M步骤。
K-Means算法与GMM(高斯混合模型)的EM解法的关系
对比K-Means算法和GMM的EM解法,我们会发现二者具有很强的相似性。K-Means算法对数据点的聚类进行了“硬分配”,即每个数据点只属于唯一的聚类;而GMM的EM解法则基于后验概率分布,对数据点进行“软分配”,即每个单独的高斯模型对数据聚类都有贡献,不过贡献值有大有小。
而其实,我们可以将K-Means算法归类为GMM的EM解法的一个特例:
考虑一个GMM(混合高斯模型),其中每个分量的协方差矩阵均为
ϵI
,从而有
p(x|μk,Σk)=1(2πϵ)D2exp(−12ϵ||xn−μk||2)
E步骤:由之前GMM的EM解法知识可知:
γnk=πkN(xn|μk,Σk)∑jπjN(xn|μj,Σj)=πkexp(−12ϵ||xn−μk||2)∑jπjexp(−12ϵ||xn−μj||2)
当 ϵ→0 时,在分母中只有 ||xn−μj||2 最小时, πjexp(−12ϵ||xn−μj||2) 趋近于0的速度最慢,也就意味着它比其他项要大的多。所以有 ||xn−μj||2=min⇒γnj→1;∀m≠j,γnm→0 。在这种极限情况下,与K均值算法相同,我们得到了对数据点聚类的一个硬分配。
M步骤: EZ[X,Z|π,μ,Σ]=∑n∑kγnk{lnπk+lnN(xn|μk,Σk)}
当
ϵ→0
时,则
EZ[X,Z|π,μ,Σ]=∑n∑kγnk{lnπk+lnN(xn|μk,Σk)}=∑n∑kγnklnπk+∑n∑k(−12ϵ||xn−μk||2)=1ϵ⋅(−12∑n∑k(γnk||xn−μk||2))+∑n∑kγnklnπk
由于
πk
仅仅是聚类点在
k
类中的比例,其值对于E步骤
从此可知,K-Means算法其实是GMM的EM解法在高斯分量协方差 ϵI→0 时的一个特例。
实际应用中,对于 K-means,我们通常是重复一定次数然后取最好的结果,但由于 GMM 每一次迭代的计算量比 K-means 要大许多,使用GMM时,一个更流行的做法是先用 K-means (已经重复并取最优值了)得到一个粗略的结果,然后将其作为初值(只要将 K-means 所得的 聚类中心传给 GMM即可),再用 GMM 进行细致迭代。
相关文章:
EM算法(期望最大化)——理论部分http://blog.csdn.net/tingyue_/article/details/70474042
EM算法(期望最大化)——应用:GMM http://blog.csdn.net/tingyue_/article/details/70576025