记录:EM 算法估计混合高斯模型参数
当概率模型依赖于无法观测的隐性变量时,使用普通的极大似然估计法无法估计出概率模型中参数。此时需要利用优化的极大似然估计:EM算法。
在这里我只是想要使用这个EM算法估计混合高斯模型中的参数。由于直观原因,采用一维高斯分布。
一维高斯分布的概率密度函数表示为:

多个高斯分布叠加在一起形成混合高斯分布:

其中:k 表示一共有 k 个子分布,
。为什么累加之和为 1?因为哪怕是混合模型也表示一个概率密度,从负无穷到正无穷积分概率为 1,所以只有累加之和为 1才能保证,很简单的推导。
设总体 ξ,总体服从混合高斯分布。
是一个取自总体的样本。罢了,公式编辑实在慢到令人发指,简单记录而已,手写。
以下是关于一维混合高斯分布的参数估计推导过程:


参考:周志华《机器学习》
简单代码实现一下,代码很丑:
import numpy as np
import matplotlib.pyplot as plt # 使用 numpy 生成两组符合高斯分布(正态分布)的数据,然后将他们累加成混合模型,使用 EM 算法求解其中参数
# 假设两个分布累加的系数 α1=0.6,α2=0.4
# 假设 N1 分布的均值 μ1=1.7,方差 δ1²=0.57²=0.3249
# 假设 N2 分布的均值 μ2=3.5,方差 δ2²=0.33²=0.1089
np.random.seed(77)
num1 = 6000
num2 = 4000
X1 = np.random.normal(1.7, 0.57, num1).astype(np.float32)
X2 = np.random.normal(3.5, 0.33, num2).astype(np.float32)
X = np.hstack((X1, X2)) # 其中包含两个高斯分布的数据
np.random.shuffle(X) # 混洗数据 re_tuple = plt.hist(X, 300, density=1, facecolor='r')
plt.show() # 设置 EM 算法的初始值,任意设置
modulus = np.array([0.2, 0.8])
mean = np.array([1.1, 2.1])
var = np.array([1.2, 1.5]) # 首先计算每个样本点由每一个独立分布产生的概率,然后通过推导公式去更新参数
gamma_j_i = np.zeros((2, num1 + num2), dtype=np.float32) # 设置迭代次数
epochs = 100
for epoch in range(epochs):
print('开始第 %d 次迭代 ...' % (epoch + 1))
# E 步
part_1 = 1 / np.sqrt(2 * np.pi * var[0])
part_2 = 1 / np.sqrt(2 * np.pi * var[1])
for i in range(2):
part_i = 1 / np.sqrt(2 * np.pi * var[i])
for j in range(num1 + num2):
p_m = (modulus[0] * (part_1 * np.exp(-1 * ((X[j] - mean[0]) ** 2) / (2 * var[0]))) +
modulus[1] * (part_2 * np.exp(-1 * ((X[j] - mean[1]) ** 2) / (2 * var[1]))))
p_i = modulus[i] * (part_i * np.exp(-1 * ((X[j] - mean[i]) ** 2) / (2 * var[i])))
gamma_j_i[i, j] = p_i / p_m # 中间计算步骤
sum_gamma_j_i = np.sum(gamma_j_i, axis=1)
sum_for_mean = np.matmul(gamma_j_i, X)
sum_for_var = np.sum(gamma_j_i * np.square(np.broadcast_to(X, (2, num1 + num2)) - mean.reshape((2, 1))), axis=1) # M 步
for i in range(2):
mean[i] = sum_for_mean[i] / sum_gamma_j_i[i]
modulus[i] = sum_gamma_j_i[i] / (num1 + num2)
var[i] = sum_for_var[i] / sum_gamma_j_i[i] print('迭代 %d 次后得到的 N1 分布的比率、均值和方差分别为:%s %s %s' % (epoch + 1, modulus[0], mean[0], var[0]))
print('迭代 %d 次后得到的 N2 分布的比率、均值和方差分别为:%s %s %s' % (epoch + 1, modulus[1], mean[1], var[1]))
print() # 迭代 100 次后得到的结果是:
# N1: 0.59798 1.69166 0.33037
# N2: 0.40202 3.49959 0.11023
# 总之,结果还不错
记录:EM 算法估计混合高斯模型参数的更多相关文章
- EM算法与混合高斯模型
非常早就想看看EM算法,这个算法在HMM(隐马尔科夫模型)得到非常好的应用.这个算法公式太多就手写了这部分主体部分. 好的參考博客:最大似然预计到EM,讲了详细样例通熟易懂. JerryLead博客非 ...
- <转>与EM相关的两个算法-K-mean算法以及混合高斯模型
转自http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html http://www.cnblogs.com/jerrylead/ ...
- EM相关两个算法 k-mean算法和混合高斯模型
转自http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html http://www.cnblogs.com/jerrylead/ ...
- 机器学习3_EM算法与混合高斯模型
①EM算法: http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html 李航 <统计学习方法>9.1节 ②混合高斯模 ...
- [zz] 混合高斯模型 Gaussian Mixture Model
聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...
- 混合高斯模型:opencv中MOG2的代码结构梳理
/* 头文件:OurGaussmix2.h */ #include "opencv2/core/core.hpp" #include <list> #include&q ...
- sklearn聚类模型:基于密度的DBSCAN;基于混合高斯模型的GMM
1 sklearn聚类方法详解 2 对比不同聚类算法在不同数据集上的表现 3 用scikit-learn学习K-Means聚类 4 用scikit-learn学习DBSCAN聚类 (基于密度的聚类) ...
- 混合高斯模型(Mixtures of Gaussians)和EM算法
这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示 ...
- PRML读书会第九章 Mixture Models and EM(Kmeans,混合高斯模型,Expectation Maximization)
主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:10:56 今天的主要内容有k-means.混合高斯模型. EM算法.对于k-me ...
随机推荐
- [20180713]关于hash join 测试中一个疑问.txt
[20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...
- centos7发行版号对应基于RHEL Source(版本)对照表
基础分布 详情地址:https://wiki.centos.org/Download 存档版本 CentOS Linux 7 发布 基于RHEL Source(版本) 存档的树 7(1804) 7.5 ...
- CentOS7查询系统版本内核信息
1. 查看版本号 查看CentOS的版本号命令: [root@localhost ~]# cat /etc/centos-releaseCentOS Linux release 7.4.1708 (C ...
- 通过logstash过滤、分析日志数据
logstash是怎么工作的呢? Logstash是一个开源的.服务端的数据处理pipeline(管道),它可以接收多个源的数据.然后对它们进行转换.最终将它们发送到指定类型的目的地.Logstash ...
- BeanFactory和ApplicationContext的简单介绍
引言 Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语音的反射功能实例化Bean并建立Bean之间的依赖关系.Spring的IoC容器在完成这些底层工作的基础上,还提供 ...
- Unity手游之路手游代码更新策略探讨
版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项 ...
- Android实践--apk反编译
版权声明:本文为博主原创文章.转载请注明出处. https://blog.csdn.net/ysjian_pingcx/article/details/25468867 Android apk反编译一 ...
- 表情存储异常--mybatis抛出异常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)
文章参考 https://blog.csdn.net/junsure2012/article/details/42171035 https://www.cnblogs.com/WangYunShuai ...
- kubernetes环境搭建
两台服务器 centos-master 172.16.120.189 centos-minion 172.16.120.190 master上运行etcd, kube-apiserver, kub ...
- CommonJS, AMD, CMD是什么及区别--简单易懂有实例
CommonJS, AMD, CMD都是JS模块化的规范. CommonJS是服务器端js模块化的规范,NodeJS是这种规范的实现. AMD(异步模块定义)和CMD(通用模块定义)都是浏览器端js模 ...