EM算法
EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计。每一次迭代由两步组成:E步,求期望(expectation);M步,求极大(maximazation)。不断循环直到算法收敛,最后得出参数的估计。
之所以要搞得这么麻烦,就是因为有隐变量(latent variable)这个东西的存在,隐变量是无法观测的,这就造成了我们的观测值和想要预测的参数值之间的差距。如果所有的变量都是可观测的,我们使用极大似然法就可以得出对参数的估计了。
一般地,我们用Y表示观测随机变量的数据,Z表示隐随机变量的数据,Y和Z连在一起称为完全数据。假设给定观测数据Y,其概率分布是
下面介绍EM算法的步骤:
输入:观测变量数据Y,隐变量数据Z, 联合分布
输出:模型参数
(1)选择参数的初始值
(2)E步:
(3)M步:求使得
(4)重复第(2)(3)步,直到参数值收敛。
注意几个分布之间是有关系的,其实就是条件概率公式,只是多了个
另外EM算法对于初值的选取是敏感的,所以在实际中需要多选几个初始值多试几次。
上面的算法有些难以理解,因为我没有写推导过程,感兴趣的可以看看李航老师的《统计学习方法》P158“EM算法的导出”。总的来说就是我们本来要极大化的是观测数据的对数似然函数,即:
这个似然函数对于简单的问题是可以处理的(可以参看《统计学习方法》9.1的三硬币模型作为参考),只是在EM算法中又进行了处理,它找出了似然函数的一个下界
所以EM算法我们不断求
只看上面的算法不容易理解,下面介绍高斯混合模型,高斯混合模型的求解就利用了EM算法。
高斯混合模型(GMM)
高斯混合模型是采用概率模型来表达聚类原型的,他是假设整个数据集由k个高斯模型生成的,然后我们由EM算法求出模型参数以及每个数据点最有可能由哪个高斯模型生成,最后由同一个高斯模型生成的数据点划分成一类。
首先,下面是多元高斯分布的概率密度函数
其中
然后高斯混合分布可记为
其中
如果一个数据集由上面的模型生成,那么首先是按照
令随机变量
上式即为样本
这时我们再采用极大似然估计来估计模型参数,那么对数似然函数为
然后对这个对数似然函数相对参数
注意以上结果只是对于一个数据点而言的。
令
同理令
对于
再对上式求
对式子两边同时乘以
那么再代回上式可得
经过以上几步计算,可以看到,我们在假设知道
即概率最大的标记。
回顾整个过程,我们的基本假设是数据集是由多个多维高斯分布的和组成,然后数据点就相当于是上面EM算法的推导中的输出
一个scikit-learn 中的简单例子
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from sklearn import mixture
n_samples = 300
np.random.seed(0)
shifted_gaussian = np.random.randn(n_samples, 2)+ np.array([20,20])
#这是个平移过的高斯分布
C = np.array([[0,-0.7],[3.5,.7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2),C)
#这个高斯分布经过了伸缩,就是乘以矩阵C得来的,注意这里的np.dot函数,对于矩阵和向量
#就是普通的矩阵乘法和向量的点乘,但是对于这里的情况,结果是矩阵C分别右乘randn生成的(300,2)的矩阵的每一行,所以相当于是对生成的高斯分布的每个点都进行了伸缩。
X_train = np.vstack([shifted_gaussian, stretched_gaussian])
clf = mixture.GaussianMixture(n_components = 2, covariance_type = 'full')
#GMM的分类器,n_components 代表有几个高斯分量,covariance_type 代表协方差矩阵的类型,'full'代表每个高斯分量都有自己的协方差矩阵,另外比如还有'tied',代表每个分量的协方差矩阵都是相同的
clf.fit(X_train)
x = np.linspace(-20.0, 30.)
y = np.linspace(-20., 40.)
X, Y = np.meshgrid(x,y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z= -clf.score_samples(XX)
#score_samples :Compute the weighted log probabilities for each sample
#我的理解就是一个样本属于某一分量的概率,也就是假如某个点被划分到某个分量,但它的这个值比较小,那么我们就可以猜测这个点很有可能不是属于这个类的
Z = Z.reshape(X.shape)
CS = plt.contour(X,Y,Z, norm = LogNorm(vmin = 1.0, vmax = 1000.0), levels = np.logspace(0,3,10))
CB = plt.colorbar(CS, shrink = 0.8, extend = 'both')
plt.scatter(X_train[:,0], X_train[:,1], .8)
plt.title('Negative log-likelihood predicted by a GMM')
plt.axis('tight')
plt.show()
下面是结果
综上,本文大致讲了下高斯混合模型和EM算法,但我觉得二者都是思想更重要,两种方法的应用都不止在这里,比如高斯混合模型我知道在视频的运动前景提取中就有利用它来提取前景的。
来源:CSDN
作者:飞翔的蓝鲸
链接:https://blog.csdn.net/leonliu1995/article/details/78966188