一.概念

最大期望算法,也就是著名的em算法,他起源于一条dog

没错,就是这个

好吧不扯蛋了,em算法(Expectation Maximization Algorithm,又译期望最大化算法),是一种迭代算法,用于含有隐变量(latent variable)的概率参数模型的最大似然估计或极大后验概率估计。在机器学习中,最大期望(EM)算法用于在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。

最大似然估计:

这个概念解释起来非常简单,就是你调皮捣蛋天天搞事,别人家孩子学习优秀各种听话。所以一旦说出个什么坏事家长们总是认为是你干的,因为你之前干坏事的概率比较大。这是一个比较通俗的栗子,更装逼的解释请参考百度百科。

二.算法

最大期望算法经过两个步骤交替进行计算:
第一步是计算期望(E),利用概率模型参数的现有估计值,计算隐藏变量的期望;
第二步是最大化(M),利用E 步上求得的隐藏变量的期望,对参数模型进行最大似然估计。
M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。
总体来说,EM的算法流程如下:
1.初始化分布参数
2.重复直到收敛:
E步骤:估计未知参数的期望值,给出当前的参数估计。
M步骤:重新估计分布参数,以使得数据的似然性最大,给出未知变量的期望估计。

通过交替使用这两个步骤,EM算法逐步改进模型的参数,使参数和训练样本的似然概率逐渐增大,最后终止于一个极大点。直观地理解EM算法,它也可被看作为一个逐次逼近算法:事先并不知道模型的参数,可以随机的选择一套参数或者事先粗略地给定某个初始参数λ0 ,确定出对应于这组参数的最可能的状态,计算每个训练样本的可能结果的概率,在当前的状态下再由样本对参数修正,重新估计参数λ,并在新的参数下重新确定模型的状态,这样,通过多次的迭代,循环直至某个收敛条件满足为止,就可以使得模型的参数逐渐逼近真实参数。
EM算法的主要目的是提供一个简单的迭代算法计算后验密度函数,它的最大优点是简单和稳定,但容易陷入局部最优。

三.实现

模拟2个正态分布的均值预计:

import math
import copy
import numpy as np
import matplotlib.pyplot as pltisdebug = True# 指定k个高斯分布參数。这里指定k=2。注意2个高斯分布具有同样均方差Sigma,分别为M1,M2。def getdataSet(Sigma,M1,M2,k,N):dataSet = np.zeros((1,N))for i in range(N):if np.random.random(1) > 0.333:dataSet[0,i] = np.random.normal()*Sigma + M1else:dataSet[0,i] = np.random.normal()*Sigma + M2if isdebug:print ("dataSet:",dataSet)return dataSet# E算法:计算期望E[zij]
def E(Sigma,dataSet,Miu,k,N):Exp = np.zeros((N,k))Num = np.zeros(k)for i in range(N):Sum = 0for j in range(k):Num[j] = math.exp((-1/(2*(float(Sigma**2))))*(float(dataSet[0,i]-Miu[j]))**2)Sum += Num[j]for j in range(k):            Exp[i,j] = Num[j] / Sumif isdebug:print ("Exp:",Exp)return Exp# M算法:最大化E[zij]的參数Miu
def M(Exp,dataSet,k,N):Miu = np.random.random(2)for j in range(k):Num = 0Sum = 0for i in range(N):Num += Exp[i,j]*dataSet[0,i]Sum += Exp[i,j]Miu[j] = Num / Sumreturn Miu#初始参数
Sigma = 6
M1 = -20
M2 = 20
k=2
N=0xffff
Iter=0xff
EPS =1e-6#随机初始数据
dataSet=getdataSet(Sigma,M1,M2,k,N)#初始先假设一个E[zij]
Miu = np.random.random(2)
# 算法迭代
for i in range(Iter):oldMiu = copy.deepcopy(Miu)#EExp = E(Sigma,dataSet,Miu,k,N)#MMiu = M(Exp,dataSet,k,N)#如果达到精度Epsilon停止迭代if sum(abs(Miu-oldMiu)) < EPS:if isdebug:print ("Iter:",i)break
plt.figure('emmmmm',figsize=(12, 6))
plt.hist(dataSet[0,:],100)
plt.xticks(fontsize=10, color="darkorange")
plt.yticks(fontsize=10, color="darkorange")
plt.show()

四.总结

EM算法思路非常简单,就是我们想估计A和B两个参数,在开始状态下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。
EM算法和K均值算法有些类似,都是数据存在一个或多个聚集中心点,在这个点附近,样本数量明显较多。K均值算法目的是寻找聚点,EM算法的目的是估计样本的概率分布等统计参数或数据。但如果数据分散,没有明显的聚点,或者数据呈现方式比较奇葩,那么K均值和EM算法就很难派上用场了。

五.相关学习资源

http://m.blog.csdn.net/u010866505/article/details/77877345

https://www.cnblogs.com/slgkaifa/p/6731779.html

http://blog.csdn.net/zouxy09/article/details/8537620

人工智障学习笔记——机器学习(9)最大期望算法相关推荐

  1. 人工智障学习笔记——机器学习(16)降维小结

    机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式. ...

  2. 人工智障学习笔记——机器学习(4)支持向量机

    一.概念 支持向量机(Support Vector Machine),简称SVM.是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类以及回归分析. SVM的主要思 ...

  3. 人工智障学习笔记——机器学习(5)朴素贝叶斯

    一.概念 1.1贝叶斯定理:假设H[1],H[2]-,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,-,n,现观察到某事件A与H[1],H[2]-,H[n]相伴随机出现,且 ...

  4. 人工智障学习笔记——机器学习(3)决策树

    一.概念 决策树(Decision Tree)是一种十分常用的分类方法.也是监督学习的一种,是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可 ...

  5. 人工智障学习笔记——机器学习(1)特征工程

    一.概念 学习过Machine Learning的一定听过这句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 所谓特征工程,做的就是[ 最大限度地从原始数据中提取特征点以供算法 ...

  6. 人工智障学习笔记——机器学习(15)t-SNE降维

    一.概念 t-SNE(t分布随机邻域嵌入)是一种用于探索高维数据的非线性降维算法.它将多维数据映射到适合于人类观察的两个或多个维度. t-SNE主要包括两个步骤:第一.t-SNE构建一个高维对象之间的 ...

  7. 人工智障学习笔记——机器学习(12)LDA降维

    一.概念 LDA:Linear Discriminant Analysis (也有叫做Fisher Linear Discriminant).与PCA一样,是一种线性降维算法.不同于PCA只会选择数据 ...

  8. 人工智障学习笔记——机器学习(11)PCA降维

    一.概念 Principal Component Analysis(PCA):主成分分析法,是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,即把原先的n个特征用 ...

  9. 人工智障学习笔记——机器学习(8)K均值聚类

    一.概念 K均值聚类(K-means)是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算 ...

最新文章

  1. python使用tqdm实现程序运行进度条
  2. 第174天:面向对象——公有属性、私有属性和静态属性
  3. oracle 只读同名词,Oracle创建只读用户,授予视图/同义词/会话权限
  4. 中间人攻击框架以及工具,中国寒龙出品欢迎下载!~
  5. 图片验证码的JAVA工具类
  6. Comparable与Comparator用法详解
  7. oracle awr 数据删除,Oracle AWR 删除历史快照 说明【转自dave偶像大神】
  8. 区块链和java哪个更难_java 区块链中设计合理的难度系数
  9. 1081. Rational Sum (20) -最大公约数
  10. ICCV 2019 | 微软开源无监督学习的医学图像配准方法:递归级联网络
  11. 用Python写脚本:通过ssh在Windows下批量管理Linux
  12. 如何优雅的在java中统计代码块耗时
  13. 冠军轮流转:Q3 季苹果超越小米,回到全球最大的可穿戴设备厂商宝座
  14. 怎么用命令开远程主机的telnet服务1
  15. Android工具HierarchyViewer 代码导读(1) -- 功能实现演示
  16. 网站渗透测试该怎么选择最便宜
  17. 根据后台给的时区与时间戳转换时区与时间
  18. 程序员多数性功能不行_1024,节日快乐!南京程序员绝不认输!
  19. 计算机系统集成工作总结,系统集成工作总结报告.docx
  20. 用vue2写一个新闻列表页,和新闻详情页,该怎么做?

热门文章

  1. 14 SD配置-企业结构-分配-分配销售组织-分销渠道-工厂
  2. 8.0ble设备 android_蓝牙自动连入附近设备?海凌科解答不同蓝牙区别
  3. Linux下监视NVIDIA的GPU使用情况
  4. Java的static关键字用法及原理
  5. Linux查看centos版本 - 命令篇
  6. worker mpm php,Ubuntu 16.04 安裝 Apache2.4 + mpm_worker + fastcgi + php7.0
  7. 叙述计算机网络拓扑结构的定义,计算机网络拓扑结构的定义
  8. 网抑云体验室PHP网站源码
  9. ThinkCMF是一款支持Swoole的开源内容管理框架,基于ThinkPHP开发,同时支持PHP-FPM和Swoole双模式,让WEB开发更快!
  10. 左右黑白极简滚动个人主页模板