下面我们介绍一下 高斯混合模型
高斯模型有单高斯模型(SGM)和混合高斯模型(GMM)两种。
(1)单高斯模型:
为简单起见,阈值t的选取一般靠经验值来设定。通常意义下,我们一般取t=0.7-0.75之间。
二维情况如下所示:
关于高斯分布的理论部分这里不详细讲了。
(2)混合高斯模型:
对于(b)图所示的情况,很明显,单高斯模型是无法解决的。为了解决这个问题,人们提出了高斯混合模型(GMM),顾名思义,就是数据可以看作是从数个高斯分布中生成出来的。虽然我们可以用不同的分布来随意地构造 XX Mixture Model ,但是 GMM是 最为流行。另外,Mixture Model 本身其实也是可以变得任意复杂的,通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布。
另外在Weka中的EM,只是EM算法与k-means结合的一个算法,所以当初我根本就没有想过它会在clusterer包里,因为我以前经常听到的是EM和naïve bayes结合的算法,在weka里的EM 算法假设数据是由Gaussian mixture model产生的,也就是数据是由多个高斯分布的模型线性组合之后的模型产生的, 每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”(组件),这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:
这里的pai_k表示选中这个component部分的概率,我们称为加权系数,而后面的就是高斯分布函数了,K表示有K个高斯模型。
根据上面的式子,如果我们要从 GMM 的分布中随机地取一个点的话,实际上可以分为两步:
(1)首先随机地在这 K 个 Component 之中选一个,每个 Component 被选中的概率实际上就是它的系数 pai_k,选中了 Component 之后,再单独地考虑从这个 Component 的分布中选取一个点,就可以了──这里已经回到了普通的 Gaussian 分布,转化为了已知的问题。假设现在有 N 个数据点,我们认为这些数据点由某个GMM模型产生,现在我们要需要确定 pai_k,μk,σk 这些参数。很自然的,我们想到利用最大似然估计来确定这些参数,GMM的似然函数(log of the likelihood function)如下:
(2) 在最大似然估计里面,由于我们的目的是把乘积的形式分解为求和的形式,即在等式的左右两边加上一个ln函数,但是由上文求得的似然函数,可以看出,转化为log后,还有log(a+b)的形式,因此,要进一步求解。
我们采用EM算法,分布迭代求解最大值:
EM算法原理这里不作详细的介绍,可以参见博客:http://blog.pluskid.org/?p=39
注意EM算法与k-means相比要用更多的迭代次数才可以收敛 (接近收敛),并且每次迭代需要更多的计算,所以用K-means算法来找到一个Gaussian混合模型的初始值是很常见的。协方差矩阵也可以很方便地由K-means算法的簇的协方差来初始化,mixing coefficients可设为簇中的样本的比例。用梯度下降的方法来最大化log likelihood,必需用一些方法来避免likelihood函数的singularities,还需要强调的是log likelihood通常有多个局部最大值,EM算法不能保证找到全局最大值。因为针对Gaussian mixtures的EM算法是很重要的,我们在下面总结它:
参考资料:
【C++代码】
http://www.cppblog.com/Terrile/archive/2011/01/19/120051.html
http://www.autonlab.org/tutorials/gmm.html
http://blog.pluskid.org/?p=39&cpage=1#comments
http://www.cnblogs.com/CBDoctor/archive/2011/11/06/2236286.html