GMM 模型
GMM由K个Gaussian分布线性叠加而成,先看看GMM的概率密度函数:
该函数可以这么理解,假设我们有一个数据集,然后我们现在用GMM模型来描述这个数据集的分布。在已知数据集由component k 描述的情况下,数据集的概率密度函数为: p(x|k)p(x|k) 。
当然,总共有 K 个component,每个component 对生成数据集的贡献为 p(k)p(k) ,或者说数据集由component k生成的概率为 p(k)p(k),由 component k 生成数据集,其概率密度函数为 p(k)p(x|k)p(k)p(x|k) 。将所有的component加起来就得到了GMM的概率密度函数。有点绕口,大致懂就好。
如果我们要从 GMM 的分布中随机地取一个点的话,实际上可以分为两步:首先随机地在这 K个Gaussian Component 之中选一个,每个 Component 被选中的概率实际上就是它的系数 pi(k) ,选中了 Component 之后,再单独地考虑从这个 Component 的分布中选取一个点就可以了──这里已经回到了普通的 Gaussian 分布,转化为了已知的问题。
GMM 聚类
假设现在有一个大数据集,为什么要大数据集?待会会说。只要我们能用GMM算法来描述这个“客观存在”的数据集,那么GMM的K个component也就是对应的K个cluster了。根据数据来推算概率密度通常被称作 density estimation ,特别地,当我们在已知(或假定)了概率密度函数的形式,而要估计其中的参数的过程被称作“参数估计”。
每个component k 都是一个Gaussian分布,其均值设定为 μkμk ,方差设定为 ΣkΣk ,这个component的影响因子设定为 πkπk 。但是 我们一开始并不知道每个component k 的这几个参数的具体值,聚类误差函数中除了聚类后的label y之外,还有μkμk 、ΣkΣk 和 πkπk这3个我们不知道的隐含变量,这时问题就得用EM算法来迭代求解。
参数与似然函数
现在假设我们有 N 个数据点,并假设它们服从某个分布(记作 p(x)p(x) ),现在要确定里面的一些参数的值,例如,在 GMM 中,我们就需要确定 影响因子 π(k)π(k)、各类均值 μkμk 和 各类协方差 ΣkΣk 这些参数。
我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于 ΠNi=1p(xi)Πi=1Np(xi),我们把这个乘积称作似然函数 (Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和 ∑Ni=1logp(xi)∑i=1Nlogp(xi) ,具体函数如下:
接下来我们只要将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),亦即找到这样一组参数值,它让似然函数取得最大值,我们就认为这是最合适的参数,这样就完成了参数估计的过程。
由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步,E步和M步,这就是用EM算法求解GMM的过程。其实这跟K-means的求解思想很像,或者说,K-means算法的求解中就是EM算法的精髓。
算法流程
1.估计数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据 来说,它由第 个 Component 生成的概率为:
其中 N(xi|μk,Σk)N(xi|μk,Σk) 就是后验概率
2.通过极大似然估计可以通过求到令参数=0得到参数 μkμk, ΣkΣk的值
其中,Nk=∑Ni=1γ(i,k)Nk=∑i=1Nγ(i,k) ,故 πkπk 可估计为 Nk/NNk/N
相同点
都是迭代执行的算法,且迭代的策略也相同:算法开始执行时先对需要计算的参数赋初值,然后交替执行两个步骤,一个步骤是对数据的估计(k-means是估计每个点所属簇;GMM是计算隐含变量的期望;);第二步是用上一步算出的估计值重新计算参数值,更新目标参数(k-means是计算簇心位置;GMM是计算各个高斯分布的中心位置和协方差矩阵)
不同点
1)需要计算的参数不同:k-means是簇心位置;GMM是各个高斯分布的参数
2)计算目标参数的方法不同:k-means是计算当前簇中所有元素的位置的均值;GMM是基于概率的算法,是通过计算似然函数的最大值实现分布参数的求解的。
关于GMM算法中奇异矩阵的问题
这个问题应该说是GMM算法的一个瑕疵,如果运行上面的代码可以发现在求协方差矩阵的逆矩阵的时候,有时候会报错,说协方差矩阵是奇异矩阵(singular),此时求解矩阵的行列式就会报错,关于这个问题,pluskid在 一篇博客
中已经说的很清楚。这里总结一下解决方法:
- 假设有N个D维的样本数据,如果协方差矩阵是奇异矩阵,那么要检查一下N是否足够大,D是否可以减少几维
- 最简单的解决方法之一,在协方差矩阵上加上一个对角线矩阵 λIλI,其中 λλ 要足够小 ,不过如果数据集太小,这样也只是减少发生协方差矩阵是奇异矩阵的概率而已。