GMM与EM算法的Python实现
高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计。
本教程中,我们自己动手一步步实现高斯混合模型。完整代码在第4节。
预计学习用时:30分钟。
本教程基于Python 3.6。
原创者:u_u | 修改校对:SofaSofa TeamM |
1. 高斯混合模型(Gaussian Mixture models, GMM)
高斯混合模型(Gaussian Mixture Model,GMM)是一种软聚类模型。
GMM也可以看作是K-means的推广,因为GMM不仅是考虑到了数据分布的均值,也考虑到了协方差。和K-means一样,我们需要提前确定簇的个数。
GMM的基本假设为数据是由几个不同的高斯分布的随机变量组合而成。如下图,我们就是用三个二维高斯分布生成的数据集。
在高斯混合模型中,我们需要估计每一个高斯分布的均值与方差。从最大似然估计的角度来说,给定某个有 n n n个样本的数据集 X X X,假如已知GMM中一共有 k k k簇,我们就是要找到 k k k组均值 μ 1 , ⋯   , μ k \mu_1,\cdots,\mu_k μ1,⋯,μk, k k k组方差 σ 1 , ⋯   , σ k \sigma_1, \cdots, \sigma_k σ1,⋯,σk来最大化以下似然函数 L \mathcal L L
L ( ( μ 1 , ⋯   , μ k ) , ( σ 1 , ⋯   , σ k ) ; X ) . \mathcal L((\mu_1,\cdots,\mu_k), (\sigma_1, \cdots, \sigma_k);X). L((μ1,⋯,μk),(σ1,⋯,σk);X).
这里直接计算似然函数比较困难,于是我们引入隐变量(latent variable),这里的隐变量就是每个样本属于每一簇的概率。假设 W W W是一个 n × k n\times k n×k的矩阵,其中 W i , j W_{i,j} Wi,j是第 i i i个样本属于第 j j j簇的概率。
在已知 W W W的情况下,我们就很容易计算似然函数 L W \mathcal L_W LW,
L W ( ( μ 1 , ⋯   , μ k ) , ( σ 1 , ⋯   , σ k ) ; X ) , \mathcal{L}_W((\mu_1,\cdots,\mu_k), (\sigma_1, \cdots, \sigma_k);X), LW((μ1,⋯,μk),(σ1,⋯,σk);X),
将其写成
L W = ∏ i = 1 n ( ∑ j = 1 k W i , j P ( X i ∣ μ j , σ j ) ) \mathcal{L}_W=\prod_{i=1}^n\left(\sum_{j=1}^k W_{i,j}P(X_i | \mu_j, \sigma_j)\right) LW=i=1∏n(j=1∑kWi,jP(Xi∣μj,σj))
其中 P ( X i ∣ μ j , σ j ) P(X_i | \mu_j, \sigma_j) P(Xi∣μ