EM 算法 实例
#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 算法 实例的更多相关文章
- 机器学习中的EM算法具体解释及R语言实例(1)
最大期望算法(EM) K均值算法很easy(可參见之前公布的博文),相信读者都能够轻松地理解它. 但以下将要介绍的EM算法就要困难很多了.它与极大似然预计密切相关. 1 算法原理 最好还是从一个样例開 ...
- opencv3中的机器学习算法之:EM算法
不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...
- Expectation maximization - EM算法学习总结
原创博客,转载请注明出处 Leavingseason http://www.cnblogs.com/sylvanas2012/p/5053798.html EM框架是一种求解最大似然概率估计的方法.往 ...
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- EM算法--第一篇
在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(LatentVariable).最大期望 ...
- Python实现机器学习算法:EM算法
''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...
- PLSA及EM算法
前言:本文主要介绍PLSA及EM算法,首先给出LSA(隐性语义分析)的早期方法SVD,然后引入基于概率的PLSA模型,其参数学习采用EM算法.接着我们分析如何运用EM算法估计一个简单的mixture ...
- Machine Learning系列--EM算法理解与推导
EM算法,全称Expectation Maximization Algorithm,译作最大期望化算法或期望最大算法,是机器学习十大算法之一,吴军博士在<数学之美>书中称其为“上帝视角”算 ...
- EM算法--原理
EM算法即期望最大化(Expection Maximization)算法,是一种最优化算法,在机器学习领域用来求解含有隐变量的模型的最大似然问题.最大似然是一种求解模型参数的方法,顾名思义,在给定一组 ...
随机推荐
- TPS61040/61041 开关电源稳压器(DC-DC) ADJUST
Variable Control Voltage Output Voltage Adjust This method is accomplished by connecting a variable ...
- SpringMVC 理论与有用技术(一) 简单、有用、易懂的几个实例
SpringMVC先来看一下百度百科中的定义; Spring MVC属于SpringFrameWork的兴许产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应 ...
- pytest文档5-fixture之conftest.py
前言 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录. ...
- iOS-- UIimageView详解
原文地址: http://blog.csdn.net/djxiaoyu_haha/article/details/40348377 // (1)创建 UIImageView *imageView = ...
- mac下python2.x和python3.x的安装方法和升级方法/卸载
一.首先问个问题,我们为什么要升级python2.x或者python3.x的版本? 一个是低版本会有些bug:或者功能问题,或者安全问题等,另外高版本会引进一些新的功能,也会废弃一些老的功能. 可以通 ...
- Python 字符串前面加'r'
在Python的string前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意backslash '\' . 例如,\n 在raw string中,是两个字符,\和n ...
- 自建一个Java Spring MVC项目
用IDEA Intellij,本来创建的是SpringMVC项目,但是下载的时候,太慢了.所以还是用的Maven项目. 选择Maven 项目->Archetype->Web applica ...
- Thinkphp学习笔记-controller与view绑定
$this->display(); 通过上面的代码则可以输出controller所对应的view
- 【转】6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
原文:https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec105 ...
- RS报表从按月图表追溯到按日报表
相信很多COGNOS开发人员看到这个标题就会感觉很轻松,追溯无非是COGNOS自带的一个下钻的功能,但是这里却是固定的条件: 要求1:A报表显示按月的图表B报表显示按日的明细 2:追溯到B的时候B的开 ...