#coding:utf-8
import math
import copy
import numpy as np
import matplotlib.pyplot as plt isdebug = True #指定k个高斯分布參数,这里指定k=2。 #注意2个高斯分布具有同样方差Sigma。均值分别为Mu1,Mu2。
#共1000个数据 #生成训练样本。输入6,40,20,2
#两类样本方差为6。
#一类均值为20。一类为40
#随机生成1000个数
def ini_data(Sigma,Mu1,Mu2,k,N):
#保存生成的随机样本
global X #求类别的均值
global Mu
#保存样本属于某类的概率
global Expectations #1*N的矩阵。生成N个样本
X = np.zeros((1,N))
#随意给定两个初始值,任猜两类均值
#赋值一次就可以,最后要输出的量
Mu = np.random.random(2) #0-1之间
print Mu
#给定1000*2的矩阵。保存样本属于某类的概率
Expectations = np.zeros((N,k)) #生成N个样本数据
for i in xrange(0,N):
#在大于0.5在第1个分布,小于0.5在第2个分布
if np.random.random(1) > 0.5:
#均值40加上方差倍数。样本数据满足N(40,Sigma)正态分布
X[0,i] = np.random.normal()*Sigma + Mu1 #
else:
#均值40加上方差倍数,样本数据满足N(20,Sigma)正态分布
X[0,i] = np.random.normal()*Sigma + Mu2 if isdebug:
print "***********"
print u"初始观測数据X:"
print X #E步 计算每一个样本属于男女各自的概率
#输入:方差Sigma。类别k。样本数N
def e_step(Sigma,k,N):
#样本属于某类概率
global Expectations
#两类均值
global Mu
#样本
global X #遍历全部样本点,计算属于每一个类别的概率
for i in xrange(0,N):
#分母,用于归一化
Denom = 0
#遍历男女两类,计算各自归一化分母
for j in xrange(0,k):
#计算分母
Denom += math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2) #遍历男女两类,计算各自分子部分
for j in xrange(0,k):
#分子
Numer = math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2)
#每一个样本属于该类别的概率
Expectations[i,j] = Numer/Denom if isdebug:
print "***********"
print u"隐藏变量E(Z):"
print len(Expectations)
#数据总个数
print Expectations.size
#矩阵数据
print Expectations.shape
#打印出隐藏变量的值
print Expectations #M步 期望最大化
def m_step(k,N):
#样本属于某类概率P(k|xi)
global Expectations
#样本
global X
#计算两类的均值
#遍历两类
for j in xrange(0,k):
Numer = 0
Denom = 0
#当前类别下,遍历全部样本
#计算该类别下的均值和方差
for i in xrange(0,N):
#该类别样本分布P(k|xi)xi
Numer += Expectations[i,j]*X[0,i]
#该类别类样本总数Nk,Nk等于P(k|xi)求和
Denom +=Expectations[i,j]
#计算每一个类别各自均值uk
Mu[j] = Numer / Denom #算法迭代iter_num次。或达到精度Epsilon停止迭代
#迭代次数1000次, 误差达到0.0001终止
#输入:两类同样方差Sigma。一类均值Mu1,一类均值Mu2
#类别数k。样本数N,迭代次数iter_num。可接受精度Epsilon
def run(Sigma,Mu1,Mu2,k,N,iter_num,Epsilon):
#生成训练样本
ini_data(Sigma,Mu1,Mu2,k,N)
print u"初始<u1,u2>:", Mu #迭代1000次
for i in range(iter_num):
#保存上次两类均值
Old_Mu = copy.deepcopy(Mu)
#E步
e_step(Sigma,k,N)
#M步
m_step(k,N) #输出当前迭代次数及当前预计的值
print i,Mu #推断误差
if sum(abs(Mu-Old_Mu)) < Epsilon:
break if __name__ == '__main__': #sigma,mu1,mu2,模型数,样本总数,迭代次数,迭代终止收敛精度
run(6,40,20,2,1000,1000,0.0001)
plt.hist(X[0,:],100) #柱状图的宽度
plt.show()

EM 算法 实例的更多相关文章

  1. 机器学习中的EM算法具体解释及R语言实例(1)

    最大期望算法(EM) K均值算法很easy(可參见之前公布的博文),相信读者都能够轻松地理解它. 但以下将要介绍的EM算法就要困难很多了.它与极大似然预计密切相关. 1 算法原理 最好还是从一个样例開 ...

  2. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  3. Expectation maximization - EM算法学习总结

    原创博客,转载请注明出处 Leavingseason http://www.cnblogs.com/sylvanas2012/p/5053798.html EM框架是一种求解最大似然概率估计的方法.往 ...

  4. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  5. EM算法--第一篇

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

  6. Python实现机器学习算法:EM算法

    ''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...

  7. PLSA及EM算法

    前言:本文主要介绍PLSA及EM算法,首先给出LSA(隐性语义分析)的早期方法SVD,然后引入基于概率的PLSA模型,其参数学习采用EM算法.接着我们分析如何运用EM算法估计一个简单的mixture ...

  8. Machine Learning系列--EM算法理解与推导

    EM算法,全称Expectation Maximization Algorithm,译作最大期望化算法或期望最大算法,是机器学习十大算法之一,吴军博士在<数学之美>书中称其为“上帝视角”算 ...

  9. EM算法--原理

    EM算法即期望最大化(Expection Maximization)算法,是一种最优化算法,在机器学习领域用来求解含有隐变量的模型的最大似然问题.最大似然是一种求解模型参数的方法,顾名思义,在给定一组 ...

随机推荐

  1. Mastering stack and heap for system reliability

    http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Mastering_stack_and_he ...

  2. Small tips of APP H5 page

    在开发日常落地页的时候,每当碰到一些很酷炫的宣传图用css实现很复杂且耗时的时候,一般采取切图然后将其放在页面中,在这个过程中发现<img/>标签中图片下方会有一行小空白,影响了与后一部分 ...

  3. ClientDataSet的版本兼容性

    ClientDataSet的版本兼容性 在Delphi的早期版本中,Data这个Variant类型的值内部使用的是AnsiString来存贮的字节流,但我并不确定Delphi从什么时候开始,将其改为了 ...

  4. 【JSP EL】EL表达式里日期按照格式显示

    转:http://blog.csdn.net/kaishuaige/article/details/8505174 JSP页面用EL表达式 输出date格式     1.头上引入标签 <%@ t ...

  5. python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 (博客园的登录机制已经变了,不能用账号和密码登录了 ...

  6. Android -- 发送Broadcast、有序无序

    普通广播                                                                                     优缺点:和有序广播的优 ...

  7. MapReduce开发技巧

    数据类型的选择 自定义数据类型 参考:Hadoop提交作业自定义排序和分组 MapWritable/SortedMapWritable Hadoop中可传输的Map集合,和Java中的Map用法差不多 ...

  8. beyond compare 比较Xls文件时只显示有差异的列

    beyond compare是专业级的文件比较工具,可以比较所有的文件格式,已经成为我工作中的必备软件 在某一个工作项目中需要比较两个Xls文件,两个文件列是相同的,主要是看两个文件的列内容有什么变化 ...

  9. JavaScript 正则表达式——基本语法(2)

    来源:http://www.cnblogs.com/dolphinX/p/3486214.html 定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%>  ...

  10. C#基础视频教程7.3 如何编写简单游戏

    前面我们大致实现了鸟的一圈轨迹(其实如果你不做这个,就用两个矩形块的碰撞检测代替也可以),跟所有前面的教程一样,草稿打完了就要设计封装成一个类.至少到目前为止我们已经知道了鸟的属性和方法,先不要管方法 ...