EM算法的简介、推导以及C代码实现

EM算法是一个很经典的算法,有人成为上帝算法,可以可以在你不知道样本类别的情况下求出该样本的类别,前提你需要知道样本服从什么分布。是一种经典的无监督学习算法。

平常我们求解最优问题,通常采用最小二乘法,梯度下降法,高斯牛顿法,牛顿法,拟牛顿法,列-马算法等等。但是在使用这些方法之前通常会使用极大似然估计或者拉格朗日乘子法作为前序,同样EM算法也是极大似然估计的后续。极大似然估计是把累乘问题通过对数似然函数转化为累加问题,然后用梯度下降法或者其他算法求解最值问题。拉格朗日乘子法主要是为了解决偏导为0无法求解的问题,通过引入拉格朗日乘子来求解。

EM算法是通过E步和M步求解问题,E步就是为了消除隐变量,即计算出样本属于某种类别的概率。然后使用M步更新迭代参数。循环迭代直到参数波动范围很小,或者达到指定的迭代次数。

EM算法的应用,比如经典的高斯混合模型(GMM)算法上面的应用。隐马尔科夫的应用等等。

 

下面图片是我手推结果和解释:

该图是EM一个简单示例,了解什么是EM算法。

 

经典的EM算法的说明解释示例,硬币问题。包括训练和预测代码。

 

EM算法的推导,以及Jensen不等式的简单介绍说明: