本文,就像本系列的其他文章一样。旨在通过阅读原论文+手写代码的方式,自己先把算法搞明白,然后再教其他人。手写代码除了可以验证自己是否搞明白以外,我会对中间过程做图。这样,我可以通过图直观的验证算法是否正确。而这些图,又成为写文章时候的很好的素材。
什么是 Gaussian Mixture Model
GMM,简单的说,真的就是几个Gaussian分布混合在一起。把这些Gaussian分布找出来的过程,就是GMM。一般来说,可以认为GMM是聚类算法,但是scikit-learn把GMM把他放在了mixture模块下面,而不是cluster模块。
为了模拟数据,我们把两个Gaussian混合在一起。如下图。
EM算法
GMM和KMeans非常类似。
回顾一下KMeans算法,先随机设置几个中心点,然后把这些中心点周围的点聚类成一个簇。再根据簇里的点,重新选择中心点。基本上就是这个套路。
GMM其实也差不多,这里,我们用的是EM算法。EM,就是Estimation和Maximization。
首先,和KMeans一样,需要设立中心点,只不过,这里我们要找出来的,是Gaussian分布。所以,我们这里随机设置两个Gaussian分布,也就是说,我们随机设置两个平均值 μ 1 , μ 2 \mu_1, \mu_2 μ1,μ2