4. EM算法-高斯混合模型GMM详细代码实现
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的参数
- 初始化参数
#初始化参数
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)
- E步:根据当前模型,计算模型\(k\)对\(x_i\)的影响
\]
#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)
- M步:计算\(\mu_{k+1},\Sigma_{k+1}^2,\pi_{k+1}\)。
\]
\]
\]
\]
#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
- 重复2,3两步直到收敛
最后加上loglikelihood的计算方法。
- 基本的计算方法按照公式定义。
\]
实现如下
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个问题。
- 非矩阵运算,速度慢。
- 非常容易underflow,因为\(P.dot(self.alpha)\)非常容易是一个很小的数,系统把它当作0处理。
- 使用以下\(LogSumExp\)公式进行改进,并且令\(a_h = log(Q_i(z^{(i)}))+log(P(x^{(i)},z^{(i)}|\theta))\),具体实现看github:
\]
3. 总结
首先gmm算法会很容易出现underflow和overflow,所以处理的时候有点麻烦。但是\(LogSumExp\)能解决大部分这个问题。还有就是我的实现方式是需要协方差矩阵一定要是正定矩阵,所以我的代码中也做了处理。我们好想还不能够满足于最基础的GMM算法,所以在下一篇文章中我们要对GMM加入一个惩罚项,并且用对角矩阵的方式代替协方差矩阵。
4. EM算法-高斯混合模型GMM详细代码实现的更多相关文章
- 6. EM算法-高斯混合模型GMM+Lasso详细代码实现
1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...
- 3. EM算法-高斯混合模型GMM
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 GM ...
- 5. EM算法-高斯混合模型GMM+Lasso
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...
- 高斯混合模型GMM与EM算法的Python实现
GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...
- EM算法和高斯混合模型GMM介绍
EM算法 EM算法主要用于求概率密度函数参数的最大似然估计,将问题$\arg \max _{\theta_{1}} \sum_{i=1}^{n} \ln p\left(x_{i} | \theta_{ ...
- 贝叶斯来理解高斯混合模型GMM
最近学习基础算法<统计学习方法>,看到利用EM算法估计高斯混合模型(GMM)的时候,发现利用贝叶斯的来理解高斯混合模型的应用其实非常合适. 首先,假设对于贝叶斯比较熟悉,对高斯分布也熟悉. ...
- 高斯混合模型 GMM
本文将涉及到用 EM 算法来求解 GMM 模型,文中会涉及几个统计学的概念,这里先罗列出来: 方差:用来描述数据的离散或波动程度. \[var(X) = \frac{\sum_{i=1}^N( X_ ...
- Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- 2. EM算法-原理详解
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...
随机推荐
- 使用Nexus搭建Maven内部服务器
概述 我们在使用maven时,一般通过网络上一些公共的maven仓库来获取jar包,但是有时候会碰到网速比较慢的情况就比较郁闷,Nexus是一个maven的服务器,可以让我们搭建一个本 ...
- 31天重构学习笔记(java版本)
准备下周分享会的内容,无意间看到.net版本的重构31天,花了两个小时看了下,可以看成是Martin Fowler<重构>的精简版 原文地址:http://www.lostechies.c ...
- Android Studio 遇到 No Debuggable Applications 的解决方案
一.在菜单的Tools -> Android -> 勾选 Enable ADB Integration 二.在工程的build.gradle(Module:app)里加上一行代码
- hihoCoder 1015 KMP算法(kmp)
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣.他们约定好互相帮助 ...
- MapReduce中,new Text()引发的写入HDFS的输出文件多一列的问题
前段时间业务系统有个模块数据没有了,在排查问题的时候发现中间处理环节出错了,错误日志为文件格式不正确,将数据导出后发现这个处理逻辑的输入文件中每一行都多了一列,而且是一个空列(列分隔符是\t).第一次 ...
- MySQL 示例数据库 employees 详解
[引子] IT这一行在我看来是比较要求动手能力的,但是人非生而知之:人们身上的技能除了一些本能之外,大多都是通过学习而得到的. 前一段时间一直在整理素材,写一个关于explain 的系列文章:在一开始 ...
- grafana 的面板设置
1.工作中我们会计算连个字段的四则运算
- Windows系统创建符号链接文件
源文件夹:E:\深海 创建新硬链接文件夹:D:\微云同步盘\719179409\4-工作资料\深海 使用快捷键Win + X 打开以下菜单,选择命令提示符(管理员) 敲入以下命令: 创建成功后 ...
- memcached(一):linux下memcached安装以及启动
一. 安装文件 Linux系统安装memcached,首先要先安装libevent库. 下载memcached与libevent的安装文件 http://memcached.org/files/mem ...
- 关于CALayer 中的contents(图片) 拉伸
最近做有关 发送图片的功能.微信显示的图片 使用气泡遮罩出来的..而且图片尺寸也不止一种. 既然UIImagView 可以拉伸图片,设置遮罩的CALayer 的content 可不可以. 关键CALa ...