gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
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\)的影响
\[\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)
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
重复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个问题。
非矩阵运算,速度慢。
非常容易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加入一个惩罚项,并且用对角矩阵的方式代替协方差矩阵。
gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现相关推荐
- EM算法高斯混合模型原理详解及小例子
EM算法与混合高斯模型 EM算法经常用在混合高斯模型下,那么首先我们先介绍一下什么是混合高斯模型 什么是混合高斯模型 首先我们对于单个高斯模型我们会有如下数据,并且不同的数据服从的高斯也不同,也就是它 ...
- EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)
文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...
- 使用高斯混合模型(GMM)近似未知分布:EM算法的应用
该篇博客是对邱锡鹏老师<神经网络与深度学习>的学习笔记.在阅读本博文之前,建议读者先阅读上一篇博客EM算法. 高斯混合模型(Gaussian Mixture Model) 如果一个连续随机 ...
- EM算法及高斯混合模型GMM详述
1.最大似然估计 最大似然估计(Maximum Likelihood Estimation,MLE)就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程.直白来讲,就是给定了 ...
- ITK学习笔记(八) ITK高斯混合模型 GMM EM
ITK学习笔记(八) ITK高斯混合模型 GMM EM 1.高斯混合模型 2.变分贝叶斯高斯混合 3.ITK中的GMM.EM 1.高斯混合模型 sklearn.mixture是一个能够学习高斯混合模型 ...
- 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法
导读 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的.从中 ...
- 其他算法-高斯混合模型
目录 高斯模型 单高斯模型 高斯混合模型GMM 参数估计 单高斯模型参数估计-极大似然 高斯混合模型参数估计-EM算法 GMM与k-means 高斯模型 单高斯模型 当样本数据 x∈Rx\in\mat ...
- 高斯混合模型--GMM(Gaussian Mixture Model)
参考:http://blog.sina.com.cn/s/blog_54d460e40101ec00.html 概率指事件随机发生的机率,对于均匀分布函数,概率密度等于一段区间(事件的取值范围)的概率 ...
- 高斯混合模型--GMM
原文:http://blog.sina.com.cn/s/blog_54d460e40101ec00.html 高斯混合模型--GMM(Gaussian Mixture Model) 统计 ...
最新文章
- 直播 | 顾险峰教授讲座:对抗生成网络的几何理论解释
- 新的一年,开始新的学习旅途
- python雷达图详解_python的matplotlib---雷达图
- winform中关于panel中滚动条和键盘事件几点体会
- SPOJ - COT Count on a tree(LCA+主席树+离散化)
- 实用Python库,这几个你认识不?
- 两次秒售罄的小米10,还能火爆多久?
- 关于bacula网络备份软件的安装以及配置1
- 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...
- 启动Eclipse 报错:java was started but returned exit
- 第5 章 引用类型2
- 车载多传感器融合定位方案:GPS +IMU+MM
- PcShare服务端改造
- matlab用矩形法求函数定积分,C语言使用矩形法求定积分的通用函数
- 计算机应用中格式刷怎么用,Word中格式刷怎么用? -电脑资料
- 基于php+mysql的学员量化考评系统
- onnxruntime.capi.onnxruntime_pybind11_state.InvalidProtobuf: [ONNXRuntimeError] : 7 : INVALID_PROTOB
- Windows 10错误在打开特定路径时导致BSOD崩溃
- Hadamard矩阵和Kronecker积
- LaTeX排版系统及与word的区别
热门文章
- linux4.0 RT负载均衡原理
- 2020-08-13 图像处理入门软件应该怎么选?Opencv matlab 和Python
- ios微信抓https包提示证书安全警告解决办法
- 半导体测试概论笔记——第二章半导体测试基本概念
- React Native开发环境配置检测
- 拿什么拯救炒币上瘾的你
- php array_sli ce,JavaScript Array --map()、filter()、reduce()、forEach()函数的使用
- CATIA V5 R24 2014安装教程
- 无网卡驱动,电脑可以用Usb线联网
- python语法详解_关于python:NLTK中解析的英语语法