• EM算法及其应用: K-means 与 高斯混合模型


    EM算法及其应用(一)

    EM算法及其应用(二): K-means 与 高斯混合模型



    上一篇阐述了EM算法的主要原理,这一篇来看其两大应用 —— K-means 与 高斯混合模型,主要由EM算法的观点出发。



    K-means


    K-means的目标是将样本集划分为K个簇,使得同一个簇内样本的距离尽可能小,不同簇之间的样本距离尽可能大,即最小化每个簇中样本与质心的距离。K-means属于原型聚类(prototype-based clustering),原型聚类指聚类结构能通过一组原型刻画,而原型即为样本空间中具有代表性的点。在K-means中,这个原型就是每个簇的质心 (oldsymbol{mu})


    从EM算法的观点来看,K-means的参数就是每个簇的质心 (oldsymbol{mu}),隐变量为每个样本的所属簇。如果事先已知每个样本属于哪个簇,则直接求平均即可得到 (oldsymbol{mu}) 。但现实中不知道的情况下,则需要运用EM的思想:


    假设要k个簇,先随机选定k个点作为质心({oldsymbol{mu_1}, oldsymbol{mu_2} cdots oldsymbol{mu_k}})

    1. 固定(oldsymbol{mu_k}),将样本划分到距离最近的(oldsymbol{mu_k})所属的簇中。若用(r_{nk})表示第n个样本所属的簇,则

    [r_{nk} = left. egin{cases} 1 \,\, & ext{if} ;;;k = mathop{argmin}_j ||mathbf{x}_n - oldsymbol{mu}_j||^2 \ 0 \,\, & ext{otherwise} end{cases} ight. ]


    2. 固定$r_{nk}$,根据上一步的划分结果重新计算每个簇的质心。由于我们的目标是最小化每个簇中样本与质心的距离,可将目标函数表示为 $J = sumlimits_{n=1}^N r_{nk} ||mathbf{x}_n - oldsymbol{mu}_k||^2$,要最小化$J$则对$oldsymbol{mu}_k$求导得 $2sumlimits_{n=1}^N r_{nk}(mathbf{x}_n - oldsymbol{mu}_k) = 0$,则 $$ oldsymbol{mu}_k = frac{sum_nr_{nk} mathbf{x}_n}{sum_n r_{nk}} $$ 即簇中每个样本的均值向量。

    上面两步分别更新(r_{nk})(oldsymbol{mu_k})就对应了EM算法中的E步和M步。和EM算法一样,K-means每一步都最小化目标函数 (J),因而可以保证收敛到局部最优值,但在非凸目标函数的情况下不能保证收敛到全局最优值。另外,K-means对每个样本进行“硬分配(hard assignment)”,即只归类为一个簇,然而某些样本可能处于簇与簇的边界处,将这些样本强行分到其中一个簇可能并不能反映确信度。后文的高斯混合模型可进行“软分配(soft assignment)”, 即对每个样本所划分的簇进行概率估计。


    最后总结一下K-means算法的优缺点:

    优点

    1. 可解释性比较强。
    2. 调参的参数仅为簇数k。
    3. 相对于高斯混合模型而言收敛速度快,因而常用于高斯混合模型的初始值选择。K-means 的时间复杂度为 (mathcal{O}(Ncdot K cdot I)) ,簇数 (K) 和 迭代次数 (I) 通常远小于(N),所以可优化为 (mathcal{O}(N)) ,效率较高。

    缺点

    1. 对离群点敏感。

    2. K值难以事先选取,交叉验证不大适合,因为簇越多,目标函数 (sumlimits_{n=1}^N r_{nk} ||mathbf{x}_n - oldsymbol{mu}_k||^2) 就越小。常采用的方法有:一、“拐点法”,如下图 K=3 就是一个拐点。

    二、 加上正则化系数 (lambda) ,使得 (sumlimits_{n=1}^N left(r_{nk} ||mathbf{x}_n - oldsymbol{mu}_k||^2 ight) + lambda K) 最小。
    3. 无法保证收敛到全局最优值,常使用不同的初始值进行多次试验。也可以通过 K-means++ 算法优化,核心思想是选取与已有质心距离较远的点作为初始值。

    1. 只能发现球状的簇。

    2. 由于采用欧氏距离,无法直接计算类别型变量。




    高斯混合模型


    高斯混合模型同样多用于聚类,与K-means不同的是其采用概率模型来表达聚类原型。
    首先回顾一下高斯分布(Gaussian Distribution):对于随机变量(x),其概率密度函数可表示为:

    [mathcal{N}(x|mu, sigma^2) = frac{1}{sqrt{2pisigma^2}}e^{-frac{(x-mu)^2}{2sigma^2}} ]

    (mathbf{x})为n维随机向量,则多元高斯分布(Multivariate Gaussian Distribution)为:

    [mathcal{N}(mathbf{x}| oldsymbol{mu},mathbf{Sigma}) = frac{1}{(2pi)^{frac{n}{2}}|Sigma|^frac12}\,e^{-frac12(mathbf{x}-oldsymbol{mu})^Tmathbf{Sigma}^{-1}(mathbf{x}-oldsymbol{mu})} ]

    其中(oldsymbol{mu})为n维均值向量,(mathbf{Sigma})(n imes n)的协方差矩阵,(|mathbf{Sigma}|)(mathbf{Sigma})的行列式。


    很多时候我们发现单个高斯分布无法很好地描述数据的性质,如下图数据分成了两个簇,如果使用两个高斯分布明显能更好地描述其结构。


    因此沿着这个思路就诞生了高斯混合模型(Mixture of Gaussians),本质上是k个高斯分布的线性组合,这样灵活性大增,能描述更多样的分布:

    [p(mathbf{x}) = sumlimits_{k=1}^{K}pi_kmathcal{N}(mathbf{x}|oldsymbol{mu}_k,mathbf{Sigma}_k) qquad ag{1.1} ]

    其中(0 leqslantpi_kleqslant 1)为混合系数(mixing coefficients),满足(sumlimits_{k=1}^{K} pi_k= 1)


    由于本文的主角是EM算法,所以下面以EM算法的角度来看待高斯混合模型。

    回忆EM算法是一种对含有隐变量的概率模型参数的极大似然估计。通常隐变量(mathbf{Z})未知,而实际知晓的只有观测数据(mathbf{X})。而对于高斯混合模型来说,观测数据是这样产生的:先依照(pi_k)选择第k个高斯分模型,然后依照其概率密度函数进行采样生成相应的样本。

    可以看到在经过上述过程后我们拿到手的只有采样得来的样本,却不知道每个样本来自于哪个分模型,但这样就表示我们获得了高斯混合模型的隐变量。

    这里定义K维随机向量 (mathbf{z} = egin{bmatrix} z_1 \ z_2 \ vdots \ z_k \ end{bmatrix})(mathbf{z})中只有一个(z_k)为1,其余元素为0,即(z_k = left. egin{cases}1\,, & ext{数据来自第k个分模型} \ 0\,, & ext{否则} end{cases} ight.)


    这样(z_k)即为高斯混合模型的隐变量,表示样本来自于第k个分模型。


    由于(p(mathbf{x}) = sumlimits_zp(mathbf{x},mathbf{z}) = sumlimits_{z}p(mathbf{z})\,p(mathbf{x}|mathbf{z})),对比((1.1))式中高斯混合模型的定义,可将(pi_k)视为选择第k个分模型的先验概率,即(pi_k = p(z_k = 1));而对应的(mathcal{N}(mathbf{x}|mathbf{mu}_k, mathbf{Sigma}_k) = p(mathbf{x}|z_k = 1))。另外在得到观测数据({mathbf{x}_1, mathbf{x}_2 cdots mathbf{x}_n})后,每个(mathbf{x}_n)都对应一个隐变量(z_{nk}),则运用贝叶斯定理,(mathbf{x}_n)属于第k个分模型的后验概率 (记作(gamma(z_{nk})))为:

    [egin{align*} gamma(z_{nk}) = p(z_{nk} = 1|mathbf{x}_n) & = frac{p(z_{nk} = 1)\,p(mathbf{x}_n|z_{nk} = 1)}{sumlimits_{j=1}^Kp(z_{nj}=1)\,p(mathbf{x}_n|z_{nj} = 1)} \ & = frac{pi_k\,mathcal{N}(mathbf{x}_n|mathbf{mu}_k,mathbf{Sigma}_k)}{sumlimits_{j=1}^K pi_j\,mathcal{N}(mathbf{x}_n|mathbf{mu}_j,mathbf{Sigma}_j)} ag{1.2} end{align*} ]


    下图显示了$gamma(z_{nk})$的作用,图a是依照完全数据的联合分布$p(mathbf{x},mathbf{z})$作图,每个点依照其所属的第k个分模型标记颜色,这类似于“硬分配”; 图b则不考虑隐变量$mathbf{z}$,仅依照不完全数据$mathbf{x}$直接作图; 图c则考虑了每个样本来自于各个分模型的后验概率$gamma(z_{nk})$,这样一些在簇中间的点的颜色是红蓝绿三种颜色的混合,表明这些点来自于每个簇的概率比较接近,这即为“软分配”。



    为了估计参数,如果直接采用极大似然法,则

    [egin{align*} L(mathbf{ heta}) = ln\,p(mathbf{X}|mathbf{ heta}) = ln\,p(mathbf{X}|mathbf{pi},oldsymbol{mu},mathbf{Sigma}) & = lnleft[prodlimits_{n=1}^Nleft(sumlimits_{k=1}^K\,pi_k mathcal{N}(mathbf{x}_n|oldsymbol{mu}_k,mathbf{Sigma}_k) ight) ight] \[2ex] & = sumlimits_{n=1}^N lnleft(sumlimits_{k=1}^K pi_k frac{1}{(2pi)^{frac{n}{2}}|Sigma|^frac12}\,e^{-frac12(mathbf{x}-oldsymbol{mu})^Tmathbf{Sigma}^{-1}(mathbf{x}-oldsymbol{mu})} ight) end{align*} ]

    上式直接求导比较复杂,因为存在“和的对数” (ln (sum_{k=1}^Kpi_k\,mathcal{N} cdot)) ,而如果使用EM算法则会方便很多。


    先依照上一篇EM算法的流程,写出含Q函数:

    [mathcal{Q}(mathbf{ heta}, mathbf{ heta}^{(t)}) = sumlimits_{n=1}^Nsumlimits_{mathbf{z}}p(mathbf{z}|mathbf{x}_n,mathbf{pi}^{(t)},oldsymbol{mu}^{(t)},mathbf{Sigma}^{(t)})\,ln(mathbf{x}_n,mathbf{z}|pi,oldsymbol{mu},mathbf{Sigma}) ag{1.3} ]

    ((1.2))式可知,((1.3))中第一项 (p(z_{nk} = 1|mathbf{x}_n,pi^{(t)},oldsymbol{mu}^{(t)},mathbf{Sigma}^{(t)}) = gamma(z_{nk})),表示当前参数下每个样本(mathbf{x}_n)属于第k个分模型的后验概率。而第二项为完全数据的对数似然函数:

    [egin{align*} ln(mathbf{x}_n,mathbf{z}|pi,mathbf{mu},mathbf{Sigma}) & = lnprodlimits_{k=1}^K left[pi_kmathcal{N}(mathbf{x}_n|oldsymbol{mu}_k,mathbf{Sigma_k}) ight]^{z_{nk}} \ & = sumlimits_{k=1}^Kz_{nk} left[ln pi_k + ln\,mathcal{N}(mathbf{x_n}|oldsymbol{mu}_k,mathbf{Sigma}_k) ight] end{align*} ]

    由此((1.3))式变为:

    [egin{align*} & sumlimits_{n=1}^Nsumlimits_{k=1}^K gamma (z_{nk}) left[ln pi_k + ln\,mathcal{N}(mathbf{x_n}|oldsymbol{mu}_k,mathbf{Sigma}_k) ight] \ = ;& sumlimits_{n=1}^Nsumlimits_{k=1}^K gamma (z_{nk}) left[ln\,pi_k + lnleft(frac{1}{(2pi)^frac{n}{2}|mathbf{Sigma|^frac{1}{2}}}\,e^{-frac12 (mathbf{x}_n - oldsymbol{mu}_k)^Tmathbf{Sigma}_k^{-1}(mathbf{x}_n-oldsymbol{mu}_k)} ight) ight] ag{1.4} end{align*} ]

    可以看到上式括号中变成了“对数的和”,这使得求导方便了很多,且求解时式中(ln(cdot))(e^{(cdot)})可以相互抵消。


    ((1.4))式分别对(oldsymbol{mu}_k)(oldsymbol{Sigma}_k)求导得:

    [oldsymbol{mu}_k = frac{sumlimits_{n=1}^Ngamma(z_{nk}) cdot mathbf{x}_n}{sumlimits_{n=1}^Ngamma(z_{nk})}qquad,qquad oldsymbol{Sigma}_k = frac{sumlimits_{n=1}^N gamma(z_{nk})cdot (mathbf{x}_n - oldsymbol{mu}_k)cdot(mathbf{x}_n-oldsymbol{mu}_k)^T}{sumlimits_{n=1}^N gamma(z_{nk})} ]

    可以看到分模型k的(oldsymbol{mu}_k)(oldsymbol{Sigma}_k)是所有样本的加权平均,其中每个样本的权重为该样本属于分模型k的后验概率(gamma(z_{nk})) 。对比上文中K-means的 (oldsymbol{mu}_k = frac{sum_nr_{nk} cdot mathbf{x}_n}{sum_nr_{nk}}),二者形式类似,区别为K-means中的(r_{nk} in {0,1}),而高斯混合模型中(gamma(z_{nk}))为概率估计。


    对于混合系数(pi_k),因为有限制条件(sum_{k=1}^K pi_k = 1),因此需要使用拉格朗日乘子法转化为无约束优化问题:

    [sumlimits_{n=1}^Nsumlimits_{k=1}^K gamma (z_{nk}) left[ln\,pi_k + lnleft(frac{1}{(2pi)^frac{n}{2}|mathbf{Sigma|^frac{1}{2}}}\,e^{-frac12 (mathbf{x}_n - oldsymbol{mu}_k)^Tmathbf{Sigma}_k^{-1}(mathbf{x}_n-oldsymbol{mu}_k)} ight) ight] + lambda(sumlimits_{k=1}^K pi_k - 1) ]

    (pi_k)求导得,

    [egin{align*} & sumlimits_{n=1}^Nfrac{gamma(z_{nk})}{pi_k} + lambda = 0 qquad Longrightarrow qquad pi_k = frac{sumlimits_{n=1}^N gamma(z_{nk})}{-lambda} ag{1.5} \ & \ & ext{由于$sum_{k=1}^Kpi_k = 1;,qquad$ 则} ;;sum_{k=1}^K ;frac{sum_{n=1}^N gamma (z_{nk})}{-lambda} = 1 ;, ;lambda = -N quad 代入(1.5) ;,\ & \ & ext{得}; pi_k = frac{sum_{n=1}^Ngamma(z_{nk})}{N} end{align*} ]

    即每个分模型k的混合系数是属于k的样本的平均后验概率,由此运用EM算法能大大简化高斯混合模型的参数估计过程,在中间步只需计算(gamma(z_{nk}))就行了。



    高斯混合模型的算法流程

    输入: 样本集 (mathbf{X} = {mathbf{x}_1, mathbf{x}_2 cdots mathbf{x}_n})

    输出: 高斯混合模型参数 (pi, oldsymbol{mu}, oldsymbol{Sigma})

    1. 初始化各个分模型参数 (pi_k, oldsymbol{mu}_k, oldsymbol{Sigma}_k)
    2. E步: 依照当前模型参数,计算观测数据(mathbf{x}_n)属于分模型k的后验概率:

    [egin{align*} gamma(z_{nk}) = p(z_{nk} = 1|mathbf{x}_n) = frac{pi_k\,mathcal{N}(mathbf{x}_n|mathbf{mu}_k,mathbf{Sigma}_k)}{sumlimits_{j=1}^K pi_j\,mathcal{N}(mathbf{x}_n|mathbf{mu}_j,mathbf{Sigma}_j)} end{align*} ]


    3. M步: 根据 $gamma(z_{nk})$计算新一轮参数: $$ oldsymbol{mu}_k^{new} = frac{sumlimits_{n=1}^Ngamma(z_{nk}) cdot mathbf{x}_n}{sumlimits_{n=1}^Ngamma(z_{nk})} $$ $$ oldsymbol{Sigma}_k^{new} = frac{sumlimits_{n=1}^N gamma(z_{nk})cdot (mathbf{x}_n - oldsymbol{mu}_k^{new})cdot(mathbf{x}_n-oldsymbol{mu}_k^{new})^T}{sumlimits_{n=1}^N gamma(z_{nk})} $$ $$ pi_k^{new} = frac{sum_{n=1}^Ngamma(z_{nk})}{N} $$
    4. 重复2. 和3. 步直至收敛。



    最后总结一下高斯混合模型的优缺点:

    优点

    1. 相比于K-means更具一般性,能形成各种不同大小和形状的簇。K-means可视为高斯混合聚类中每个样本仅指派给一个混合成分的特例,且各混合成分协方差相等,均为对角矩阵(sigma^2mathbf{I})
    2. 仅使用少量的参数就能较好地描述数据的特性。

    缺点

    1. 高斯混合模型的计算量较大收敛慢。因此常先对样本集跑k-means,依据得到的各个簇来定高斯混合模型的初始值。其中质心即为均值向量,协方差矩阵为每个簇中样本的协方差矩阵,混合系数为每个簇中样本占总体样本的比例。
    2. 分模型数量难以预先选择,但可以通过划分验证集来比较。
    3. 对异常点敏感。
    4. 数据量少时效果不好。




    EM算法在半监督学习上的应用

    在现实的分类问题中常遇到数据集中只有少量样本是带有标签的,而大部分样本的标签缺失。如果直接将无标签的样本丢弃,则会容易造成大量的有用信息被浪费。而如果使用EM算法,将缺失标签视为隐变量,很多时候能达到利用所有数据进行训练的目的。流程如下:

    1. 仅用带标签样本训练学习器,得到初始参数( heta)
    2. E步: 利用训练好的学习器预测无标签样本,将其分类到概率最大的类别,这样所有样本就都有标签了。
    3. M步: 用所有样本重新训练学习器,得到参数( heta^t)
    4. 重复2. 和 3. 步直至收敛,得到最终模型。




    /

  • 相关阅读:
    优美的回文串--全国模拟(二)
    创造新世界--全国模拟(二)
    字符串分类--全国模拟(二)
    平衡数--全国模拟(二)
    最小矩形--全国模拟(二)
    组装三角形--全国模拟(二)
    深入.NET内测题
    面向对象七大设计原则
    创建数据库普通临时表和创建数据库全局变量表和俩者的区别
    使用变量 数据类型转换 逻辑控制语句(begin ...end; case...end; if...else; while)
  • 原文地址:https://www.cnblogs.com/massquantity/p/9416109.html
Copyright © 2020-2023  润新知