转载本文请先阅读关于本站中的版权说明。

高斯混合模型Gaussian Mixture Model


高斯混合模型,简称GMM,是最成熟的聚类方法之一,它假设待聚类的数据集是从多个混合在一起的多元高斯分布,从而用极大似然估计的思想来聚类。

算法假设

不同于基于划分的K-means和基于降维的谱聚类算法,高斯混合模型是基于一个简单的假设,即数据集是由多个混合在一起的多元高斯分布组成的。比如下面四个数据集中,上面一行的两个数据集都是由3个二元高斯分布混合组成的,可以使用高斯混合模型来聚类;而下面一行的两个数据集则不符合高斯混合模型的假设,其中左边那一副图最好使用谱聚类,右边那副图则是无法聚类的噪音。

因此,在使用高斯混合模型来聚类之前,最好是对自己的数据有一个大概的了解,如果你的数据集很可能不符合高斯混合模型的假设,请避免使用该算法。

虽然说高斯混合模型有比较强的假设限制了其使用范围,但在实际应用中高斯混合模型的使用得非常广泛,这是因为大部分需要聚类的场合,比如人脸识别,语音识别等,其数据集都或多或少的符合高斯混合模型的假设。毕竟高斯分布实在太常见,以至于很少会出现不符合该假设的应用场景。

注意高斯混合模型并不假设数据集到底是由多少个多元高斯分布叠加而成的。当然,如果我们能够知道这个信息,算法能够更快速准确的学习到数据的结构。总之,能够利用的信息越多,算法的效果就会越好。

高斯混合模型的概率密度函数

高斯混合模型的求解思路是非常直接的,对于一个待聚类的数据,比如下图:

既然我们已经通过假设知道了这个数据是由多个多元高斯分布叠加生成的,那么相当于这个数据中每个点等价于如下的模型所生成:

$$p(x;\Theta)=\sum_{k=1}^{K}\frac{\pi_{k}}{2\pi^{\frac{d}{2}}|\Sigma_{k}|^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu_{k})^{T}\Sigma_{k}^{-1}(x-\mu_{k})}$$

这个公式看上去很吓人,但其实很简单,这里\(\Theta\)代表的就是一组参数的集合,即公式右半部分使用的\(K,d,\mu_{1},\mu_{2},\cdots,\mu_{K},\Sigma_{1},\Sigma_{2},\cdots,\Sigma_{K},\pi_{1},\pi_{2},\cdots,\pi_{K}\)的集合,这一组参数能够完整的描述一个高斯混合模型。

\(K\)代表了这个模型是由多少个多元高斯分布叠加而成,\(d\)表示每个高斯分布是几元,所以一组\(K,d\)表示了这个模型是由\(K\)个\(d\)元高斯分布叠加而成。\(\mu_{i}\)表示第\(i\)个\(d\)元高斯分布的均值,这是个\(d\)维向量。\(\Sigma_{i}\)表示第\(i\)个\(d\)元高斯分布的协方差矩阵,这是个\(d*d\)的正定矩阵。\(pi_{i}\)表示第\(i\)个\(d\)元高斯分布产生的点占所有点的比重。

通常\(d\)和待聚类数据的维度一致,是已知量,而其他所有的参数都是未知量,也是高斯混合模型聚类需要求的值。

现在我们来推导这个概率公式。

假设我们已经数据服从高斯混合模型,而且符合的是参数为\(\Theta\)的高斯混合模型,那么这样一个模型产生一个落在点\(x\)的数据的概率记作\(p(x,\Theta)\)。既然这个模型是由多个高斯分布混合叠加生成,那么点\(x\)可能由\(K\)个\(d\)元高斯分布中的任意一个生成,那么有:

$$p(x;\Theta)=\sum_{k=1}^{K}\pi_{k}N(x;\mu_{k},\Sigma_{k})$$

这里\(N(x;\mu_{k},\Sigma_{k})\)是均值为\(\mu_{k}\),协方差为\(\Sigma_{k}\)的多元高斯分布的概率密度函数。

由多元高斯分布的概率密度函数的公式

$$N(x;\mu_{k},\Sigma_{k})=\frac{1}{2\pi^{\frac{d}{2}}|\Sigma_{k}|^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu_{k})^{T}\Sigma_{k}^{-1}(x-\mu_{k})}$$

代入即可得到高斯混合模型的概率密度公式。

极大似然估计

现在得到了高斯混合模型的概率密度公式的形式,我们要求的就是参数了。最容易想到的办法就是使用极大似然估计。

对数据集\(X\)中的\(n\)个数据点\(x_{1},x_{2},\cdots,x_{n}\),将他们带入到高斯混合模型的概率密度公式相乘后取对数得到对数似然估计函数(log-likelihood function)

$$l(\Theta)=log\prod_{i=1}^{n}p(x_{i};\Theta)=\sum_{i=1}^{n}log(\sum_{k=1}^{K}\pi_{k}N(x_{i};\mu_{k},\Sigma_{k}))$$

然而这个对数似然函数的形式太复杂,难以直接通过解这个方程得到解析解,因此我们要使用EM(Expectation Maximization)算法来求得一个局部最优解。

EM算法

EM算法全称是Expectation Maximization,即期望最大化算法,在1977年由Arthur Dempster,Nan Larid和Donald Rubin提出。该算法专门用来迭代求解极大似然估计,由于EM算法属于一个独立部分,这里只简单说明一下。

EM算法的要点在于引入中间变量使得极大似然函数可以变形,然后该算法主要分为两个步骤,E步和M步,在E步时算法配合引入的中间变量变形对数极大似然函数求出一个极大似然的估计值;在M步中利用Jenson不等式更新参数得到一个比估计值更优的极大似然函数值。

E步和M步交替进行,直到无法更新出更大的极大似然函数值,算法终止。

对于高斯混合模型的求解,对每个数据点\(x_{i}\)在每个\(d\)元高斯分布上\(N_{k}\),我们都先引入中间变量\(z_{i}^{k}\)和其相应的概率密度函数\(Q_{i}\)

那么原来的极大似然函数可以写成含\(z\)的形式

$$l(\Theta)=\sum_{i=1}^{n}\sum_{z_{i}}Q_{i}(z_{i})log\frac{p(x_{i},z_{i};\Theta)}{Q_{i}(z_{i})}$$ $$=\sum_{i=1}^{n}\sum_{k=1}^{K}Q_{i}(z_{i}^{k})log\pi_{k}N(x_{i};\mu_{k},\Sigma_{k})$$

然后EM算法中的E步,即求得中间变量\(Q_{i}(z_{i}^{k})\)。

$$Q_{i}(z_{i}^{k})=p(z_{i}^{k}|x_{i};\Theta)$$ $$=\frac{\pi_{k}N(x_{i};\mu_{k},\Sigma_{k})}{\sum_{k=1}^{K}\pi_{k}N(x_{i};\mu_{k},\Sigma_{k})}$$

然后在M步中更新参数的值,在这里分别对\(\Theta\)中的各参数求导即可。

$$\pi_{k}=\frac{\sum_{i=1}^{n}Q_{i}(z_{i}^{k})}{n}$$ $$\mu_{k}=\frac{\sum_{i=1}^{n}x_{i}Q_{i}(z_{i}^{k})}{\sum_{i=1}^{n}Q_{i}(z_{i}^{k})}$$ $$\Sigma_{k}=\frac{\sum_{i=1}^{n}(x_{i}-\mu_{k}(x_{i}-\mu_{k})^{T}Q_{i}(z_{i}^{k}))}{\sum_{i=1}^{n}Q_{i}(z_{i}^{k})}$$

循环执行EM步,直到\(Q_{i}(z_{i}^{k})\)收敛到一个稳定值,这是计算出来的\(\Theta\)就是我们聚类用的高斯混合模型,求解完毕。

举例

R语言中有mclust包提供了Mclust函数用于计算高斯混合模型。

我们对经典的Iris数据集应用高斯混合模型。

#R语言代码
library(mclust)
library(ggplot2)

data(iris)
model <- Mclust(iris[,-5], 3)#如果我们不知道数据由几类构成,这里应使用model <- Mclust(iris[,-5])
print(summary(model, parameters = TRUE))

iris$gmm <- as.factor(model$classification)
fig <- ggplot(iris, aes(x = Sepal.Length,y = Sepal.Width)) + geom_point(aes(colour = Species))
print(fig)

mclust函数给出了解,从上到下分别是\(\pi_{k},\mu_{k}\)和\(\Sigma_{k}\)

Mixing probabilities:
        1         2         3 
0.3333333 0.3003844 0.3662823 

Means:
              [,1]     [,2]     [,3]
Sepal.Length 5.006 5.914879 6.546670
Sepal.Width  3.428 2.777504 2.949495
Petal.Length 1.462 4.203758 5.481901
Petal.Width  0.246 1.298819 1.985322

Variances:
[,,1]
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.13322911  0.10940214  0.019196013 0.011587928
Sepal.Width    0.10940214  0.15497824  0.012098300 0.010011682
Petal.Length   0.01919601  0.01209830  0.028276976 0.005819438
Petal.Width    0.01158793  0.01001168  0.005819438 0.010693650
[,,2]
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.22561867  0.07613421   0.14679059  0.04331622
Sepal.Width    0.07613421  0.08020281   0.07370230  0.03435034
Petal.Length   0.14679059  0.07370230   0.16601076  0.04947014
Petal.Width    0.04331622  0.03435034   0.04947014  0.03335458
[,,3]
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.42946303  0.10788462   0.33465810  0.06547643
Sepal.Width    0.10788462  0.11602293   0.08918583  0.06141314
Petal.Length   0.33465810  0.08918583   0.36451484  0.08724485
Petal.Width    0.06547643  0.06141314   0.08724485  0.08671670

下面两张图中左图是标准的Iris数据,右图是使用高斯混合模型聚类得到的数据,为了画图展示,原本是4维(\(d=4\))的Iris数据投影在2维上。可见高斯混合模型达到了几乎完美的学习效果。

如果你觉得本文对你很有帮助的话,你可以请作者喝杯咖啡
或者你有任何的建议和意见,请联系站长,谢谢你的支持。