1. EM算法-数学基础

2. EM算法-原理详解

3. EM算法-高斯混合模型GMM

4. EM算法-高斯混合模型GMM详细代码实现

5. EM算法-高斯混合模型GMM+Lasso

1. 前言

EM的前3篇博文分别从数学基础、EM通用算法原理、EM的高斯混合模型的角度介绍了EM算法。按照惯例,本文要对EM算法进行更进一步的探究。就是动手去实践她。

2. GMM实现

我的实现逻辑基本按照GMM算法流程中的方式实现。需要全部可运行代码,请移步我的github

输入:观测数据\(x_1,x_2,x_3,...,x_N\)

对输入数据进行归一化处理

#数据预处理
def scale_data(self):
for d in range(self.D):
max_ = self.X[:, d].max()
min_ = self.X[:, d].min()
self.X[:, d] = (self.X[:, d] - min_) / (max_ - min_)
self.xj_mean = np.mean(self.X, axis=0)
self.xj_s = np.sqrt(np.var(self.X, axis=0))

输出:GMM的参数

  1. 初始化参数
#初始化参数
def init_params(self):
self.mu = np.random.rand(self.K, self.D)
self.cov = np.array([np.eye(self.D)] * self.K) * 0.1
self.alpha = np.array([1.0 / self.K] * self.K)
  1. E步:根据当前模型,计算模型\(k\)对\(x_i\)的影响

\[\gamma_{ik}=\frac{\pi_k\mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k,\boldsymbol{\Sigma}_k)}{\sum_{k=1}^K\pi_k\mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k,\boldsymbol{\Sigma}_k)}
\]

#e步,估计gamma
def e_step(self, data):
gamma_log_prob = np.mat(np.zeros((self.N, self.K)))
for k in range(self.K):
gamma_log_prob[:, k] = log_weight_prob(data, self.alpha[k], self.mu[k], self.cov[k])
log_prob_norm = logsumexp(gamma_log_prob, axis=1)
log_gamma = gamma_log_prob - log_prob_norm[:, np.newaxis]
return log_prob_norm, np.exp(log_gamma)
  1. M步:计算\(\mu_{k+1},\Sigma_{k+1}^2,\pi_{k+1}\)。

\[n_k=\sum_{i=1}^N\gamma_{ik}
\]

\[\mu_{k+1}=\frac{1}{n_k}\sum_{i=1}^N\gamma_{ik}x_i
\]

\[\Sigma_{k+1}^2=\frac{1}{n_k}\sum_{i=1}^N\gamma_{ik}(x_i-\mu_k)^2
\]

\[\pi_{k+1}=\frac{n_k}{N}
\]

#m步,最大化loglikelihood
def m_step(self):
newmu = np.zeros([self.K, self.D])
newcov = []
newalpha = np.zeros(self.K)
for k in range(self.K):
Nk = np.sum(self.gamma[:, k])
newmu[k, :] = np.dot(self.gamma[:, k].T, self.X) / Nk
cov_k = self.compute_cov(k, Nk)
newcov.append(cov_k)
newalpha[k] = Nk / self.N
newcov = np.array(newcov)
return newmu, newcov, newalpha
  1. 重复2,3两步直到收敛

最后加上loglikelihood的计算方法。

  • 基本的计算方法按照公式定义。

\[L(\theta) = \sum\limits_{i=1}^m log\sum\limits_{z^{(i)}}Q_i(z^{(i)})P(x^{(i)},z^{(i)}|\theta)\;\;\;s.t.\sum\limits_{z}Q_i(z^{(i)}) =1
\]

实现如下

def loglikelihood(self):
P = np.zeros([self.N, self.K])
for k in range(self.K):
P[:,k] = prob(self.X, self.mu[k], self.cov[k]) return np.sum(np.log(P.dot(self.alpha)))

但是这样的实现会有2个问题。

  1. 非矩阵运算,速度慢。
  2. 非常容易underflow,因为\(P.dot(self.alpha)\)非常容易是一个很小的数,系统把它当作0处理。
  • 使用以下\(LogSumExp\)公式进行改进,并且令\(a_h = log(Q_i(z^{(i)}))+log(P(x^{(i)},z^{(i)}|\theta))\),具体实现看github

\[log(\sum_hexp(a_h)) = m + log(\sum_hexp(a_h - m))\;\;\;m=max(a_h)
\]

3. 总结

首先gmm算法会很容易出现underflow和overflow,所以处理的时候有点麻烦。但是\(LogSumExp\)能解决大部分这个问题。还有就是我的实现方式是需要协方差矩阵一定要是正定矩阵,所以我的代码中也做了处理。我们好想还不能够满足于最基础的GMM算法,所以在下一篇文章中我们要对GMM加入一个惩罚项,并且用对角矩阵的方式代替协方差矩阵。

4. EM算法-高斯混合模型GMM详细代码实现的更多相关文章

  1. 6. EM算法-高斯混合模型GMM+Lasso详细代码实现

    1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...

  2. 3. EM算法-高斯混合模型GMM

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 GM ...

  3. 5. EM算法-高斯混合模型GMM+Lasso

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...

  4. 高斯混合模型GMM与EM算法的Python实现

    GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...

  5. EM算法和高斯混合模型GMM介绍

    EM算法 EM算法主要用于求概率密度函数参数的最大似然估计,将问题$\arg \max _{\theta_{1}} \sum_{i=1}^{n} \ln p\left(x_{i} | \theta_{ ...

  6. 贝叶斯来理解高斯混合模型GMM

    最近学习基础算法<统计学习方法>,看到利用EM算法估计高斯混合模型(GMM)的时候,发现利用贝叶斯的来理解高斯混合模型的应用其实非常合适. 首先,假设对于贝叶斯比较熟悉,对高斯分布也熟悉. ...

  7. 高斯混合模型 GMM

    本文将涉及到用 EM 算法来求解 GMM 模型,文中会涉及几个统计学的概念,这里先罗列出来: 方差:用来描述数据的离散或波动程度. \[var(X) =  \frac{\sum_{i=1}^N( X_ ...

  8. Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  9. 2. EM算法-原理详解

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...

随机推荐

  1. Android程序员必备精品资源

    平时写程序中不断收集到的一些比较常用的东西,分享给大家. 实用工具集锦 Android Lifecycle https://github.com/xxv/android-lifecycle TinyP ...

  2. System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded

    昨天客户跟我说,突然一个页面频繁地报ThrowIfMaxHttpCollectionKeysExceeded这个异常.而且是数据量大的时候报错,数据量小的时候OK. 根据异常的名称也能看得差不多超过了 ...

  3. 【Struts2】Struts2获取session的三种方式

    1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = S ...

  4. ASP.NET Core网站初探

    原文地址:https://blog.csdn.net/iml6yu/article/details/74530679 目录结构如下图   目录: Properties:属性,记录了项目属性的配置文件. ...

  5. php性能分析工具xhprof

    安装方法: wget http://pecl.php.net/get/xhprof-0.9.x.tgz cp xhprof-0.9.x.tgz /home/www/xhprof.tgz tar zxv ...

  6. easyui datagrid checkbox选中事件

    $('#grid_Order').datagrid({       onCheck: function(index, data) { //alert(data[0]);               / ...

  7. Linux共享内存使用常见陷阱与分析

    所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如 信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段 ...

  8. Android基本功:异步任务(AsyncTask)

    一.解决新线程无法更新UI组建问题的方案 为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 使用Handler实现线程之间的通信. Activity.runOnUiThre ...

  9. Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换

    Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换 解决方法:添加格式说明信息 将下面语句: \docum ...

  10. JEECG中t:dictSelect的extendJson用法

    1.t:dictSelect的各个属性值如下: 属性名 类型 描述 是否必须 默认值 title string 标题 否 null field string 控件字段名字 是 null typeGro ...