#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. 使用cwrsync做服务器文件夹同步

    首先要下载cwRsync的服务端和客户端软件(4.05免费版),下载地址如下: https://www.itefix.no/i2/cwrsync 具体的配置过程和遇到的问题可参考: http://ww ...

  2. 《Java虚拟机原理图解》3、JVM执行时数据区

    [last updated :2014/11/7]     JVM执行时数据区(JVM Runtime Area)事实上就是指JVM在执行期间,其对计算机内存空间的划分和分配.本文将通过下面几个话题来 ...

  3. Servlet实现的三种方法

    (1)方法一: //这是第一个实现servlet的方法.使用时限servlet接口的方法来实现,使用的时候须要引用servlet-api.jar package com.lc; import java ...

  4. jquery hide和show方法

    html 元素的显示和隐藏hide() 如果被选的元素已被显示,则隐藏该元素. show() 如果被选的元素已被隐藏,则显示该元素. <html> <head> <scr ...

  5. 树莓派安装 Nginx + PHP7.0 + Pi Dashboard

    之前我们介绍过树莓派搭建LNMP环境的方法,以及给树莓派装一个仪表盘来监控树莓派运行状态.近期有用户反馈树莓派最新版的系统已经无法找到 PHP5 的软件包了,这是因为新版本已经用 PHP7 替代了 P ...

  6. SMTP用户枚举原理简介及相关工具

    前言 SMTP是安全测试中比较常见的服务类型,其不安全的配置(未禁用某些命令)会导致用户枚举的问题,这主要是通过SMTP命令进行的.本文将介绍SMTP用户枚举原理以及相关工具. SMTP SMTP命令 ...

  7. FMX解析BMP文件工厂

    unit FMX.Canvas.D2D; initialization  TTextLayoutManager.RegisterTextLayout(TTextLayoutD2D, TCanvasD2 ...

  8. 【Android UI】使用RelativeLayout与TableLayout实现登录界面

    使用RelativeLayout与TableLayout分别实现两种登录界面,学习RelativeLayout布局 中如何对齐与调整组件相对位置,使用TableLayout实现登录界面,学习如何设置列 ...

  9. Linux0.11内核剖析--内核代码(kernel)--sched.c

    1.概述 linux/kernel/目录下共包括 10 个 C 语言文件和 2 个汇编语言文件以及一个 kernel 下编译文件的管理配置文件 Makefile.其中三个子目录中代码注释的将放在后面的 ...

  10. MapReduce实战--倒排索引

    本文地址:http://www.cnblogs.com/archimedes/p/mapreduce-inverted-index.html,转载请注明源地址. 1.倒排索引简介 倒排索引(Inver ...