【简介】

  em算法,指的是最大期望算法(Expectation Maximization Algorithm,又译期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计

  EM 算法是 Dempster,Laind,Rubin 于 1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,带有噪声等所谓的不完全数据。可以有一些比较形象的比喻说法把这个算法讲清楚。比如说食堂的大师傅炒了一份菜,要等分成两份给两个人吃,显然没有必要拿来天平一点的精确的去称分量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直迭代地执行下去,直到大家看不出两个碗所容纳的菜有什么分量上的不同为止。

  EM算法就是这样,假设我们估计知道A和B两个参数,在开始状态下二者都是未知的,并且知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止(百度百科)。

【算法】

  1、计算期望(E),利用概率模型参数的现有估计值,计算隐藏变量的期望;

  2、最大化(M),利用E 步上求得的隐藏变量的期望,对参数模型进行最大似然估计;

  3、M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。

【代码】

  

import math;
import copy;
import numpy as np;
import matplotlib.pyplot as plt; isdebug = True # 指定k个高斯分布參数。这里指定k=2。注意2个高斯分布具有同样均方差Sigma,分别为M1,M2。
def getdataSet(Sigma,M1,M2,k,N):
#创建长度为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 + M1
else:
dataSet[0,i] = np.random.normal()*Sigma + M2
if 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 = 0
for 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):
#求没类数据在各类中的占比,即隐藏变量Z
Exp[i,j] = Num[j] / Sum
if isdebug:
print ("Exp:",Exp) return Exp # M算法:最大化E[zij]的參数Miu
def M(Exp,dataSet,k,N):
Miu = np.random.random(k)
for j in range(k):
Num = 0
Sum = 0
for i in range(N):
Num += Exp[i,j]*dataSet[0,i]
Sum += Exp[i,j]
Miu[j] = Num / Sum
if isdebug:
print("Miu:",Miu)
return Miu #初始参数
Sigma = 6
M1 = -20
M2 = 20
k=2
N=0xffff #65535
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)
#E
Exp = E(Sigma,dataSet,Miu,k,N)
#M
Miu = 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()

【结果】

【参考文献】

https://blog.csdn.net/sm9sun/article/details/78745265

https://www.cnblogs.com/cxchanpin/p/6731780.html

------------------------------------------华丽的分割线------------------------------------------------------

有兴趣的同学可以关注公总号:RaoRao1994

EM最大期望算法的更多相关文章

  1. EM最大期望算法-走读

    打算抽时间走读一些算法,尽量通俗的记录下面,希望帮助需要的同学.   overview: 基本思想:      通过初始化参数P1,P2,推断出隐变量Z的概率分布(E步):      通过隐变量Z的概 ...

  2. 【机器学习】EM最大期望算法

    EM, ExpectationMaximization Algorithm, 期望最大化算法.一种迭代算法,用于含有隐变量(hidden variable)的概率参数模型的最大似然估计或极大后验概率估 ...

  3. MLE极大似然估计和EM最大期望算法

    机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么是神,因为神能做很多人做不了的事.那么EM ...

  4. EM最大期望化算法

    最大期望算法(Expectation-maximization algorithm,又译期望最大化算法)在统计中被用于寻找,依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计. 在统计计算中,最 ...

  5. EM(期望最大化)算法初步认识

    不多说,直接上干货! 机器学习十大算法之一:EM算法(即期望最大化算法).能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么 ...

  6. 最大期望算法 Expectation Maximization概念

    在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Lat ...

  7. EM 算法

    这个暂时还不太明白,先写一点明白的. EM:最大期望算法,属于基于模型的聚类算法.是对似然函数的进一步应用. 我们知道,当我们想要估计某个分布的未知值,可以使用样本结果来进行似然估计,进而求最大似然估 ...

  8. 顶尖数据挖掘辅助教学套件(TipDM-T6)产品白皮书

          顶尖数据挖掘辅助教学套件 (TipDM-T6)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: ht ...

  9. 顶尖大数据挖掘实战平台(TipDM-H8)产品白皮书

        顶尖大数据挖掘实战平台 (TipDM-H8)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: http: ...

随机推荐

  1. Python类(四)-多态

    多态即一个接口,多种实现 按照平常直接调用 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(obje ...

  2. 微信开发准备(二)--springmvc+mybatis项目结构的搭建

    转自:http://www.cuiyongzhi.com/post/34.html 前面一篇有说道如何在MyEclipse中搭建maven项目,这里将继续介绍如何在搭建好的基础maven项目中引入我们 ...

  3. C语言学习笔记--内存分区

    1. 程序中的栈 1.1 栈的简介 (1)栈中现代计算机程序里最为重要的概念之一 (2)栈在程序中用于维护函数调用上下文 (3)函数中的参数和局部变量存储在栈上 (4)栈保存了一个函数调用所需的维护信 ...

  4. 每天一道算法题(24)——自定义幂函数pow

    double myPower(double base, int exponent){ if(exponent==0) return 1; if(exponent==1) return base; if ...

  5. 正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"

    #!/usr/bin/env python import re def f1(arg): return 1 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / ...

  6. [poj3159]Candies(差分约束+链式前向星dijkstra模板)

    题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 解题关键:差分约束系统转化为最短路,B-A>=C,建有向边即可,与 ...

  7. 九款常用的JS代码高亮工具

    代码高亮很重要,特别是当我们想要在网站或博客中展示我们的代码的时候.通过在网站或博客中启用代码高亮,读者更方便的读取代码块. 有很多免费而且有用的代码高亮脚本.这些脚本大部分由Javascripts编 ...

  8. wpf 窗口打开后默认设置控件焦点

    https://blog.csdn.net/Vblegend_2013/article/details/81771872 <Grid FocusManager.FocusedElement=&q ...

  9. Luogu 4137 Rmq Problem / mex

    一个主席树题. 一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了. 但是这样是错的,因为一个权值会出现很多次……然后就错了. 所以我们考 ...

  10. sequoiadb的c++应用开发1

    使用sequoiadb开发c++应用时需要使用BSON对象,本篇主要讲下BSON的操作方面的东西 1:构建一个_id的BSON对象 BSON的c++驱动给我提供了一个宏BSON,使用该对象可以很方便的 ...