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)算法,是一种最优化算法,在机器学习领域用来求解含有隐变量的模型的最大似然问题.最大似然是一种求解模型参数的方法,顾名思义,在给定一组 ...
随机推荐
- .NET 4.5 is an in-place replacement for .NET 4.0
With the betas for .NET 4.5 and Visual Studio 11 and Windows 8 shipping many people will be installi ...
- 了解你的Linux系统:必须掌握的20个命令
转载:http://blog.chinaunix.net/uid-16459552-id-3877787.html 要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用 ...
- bootstrap设计站点中加入�代码高亮插件
这款插件的名字叫做google-code-prettify 使用该插件之前的效果: 使用插件之后的效果: 接下来说步骤: (1)下载两个文件 http://codecloud.sinaapp.com/ ...
- [Android 新特性] Android 4.3 Top 5新功能
直播会上,Android 4.3不像Nexus 7那么Sexy,也没有Chromecast电视棒那样惹人注目,但它有许多强悍的新特点,下面来看看Top 5. 1. 权限配置 支持在一台终端设备上有多个 ...
- [Linux] git send-email的使用
1. git send-email is included in an individual package, named "git-email":$ sudo apt-get i ...
- apache kafka监控系列-KafkaOffsetMonitor(转)
原文链接:apache kafka监控系列-KafkaOffsetMonitor 概览 最 近kafka server消息服务上线了,基于jmx指标参数也写到zabbix中了,但总觉得缺少点什么东西, ...
- iOS:提示框(警告框)控件UIActionSheet的详解
提示框(警告框)控件2:UIActionSheet 功能:当点击按钮或标签等时,弹出一个提示框,显示必要的提示,然后通过添加的按钮完成需要的功能.它与导航栏类似,它继承自UIView. 风格类型: ...
- UVA 11107(Life Forms-后缀数组+二分)
Problem C: Life Forms You may have wondered why most extraterrestrial life forms resemble humans, di ...
- Mysql命令和mysqldump的一些操作
mysql -h localhost -P5100 -ua -pb -e 'use xxx; SELECT * FROM `order_info` WHERE pay_time >= 14726 ...
- leetcode mock Shuffle an Array
1. shuffle算法: http://www.cnblogs.com/huaping-audio/archive/2008/09/09/1287985.html 注意:我们一般用的是第二种swap ...