#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. java 基础数据结构源码详解及数据结构算法

    http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html

  2. python笔记17-字典如何按value排序

    前言 面试题:如何统计数组中出现次数最多的数据,按出现次数由大到小排序 这个排序看似简单,涉及到的基础知识点还是很多的,真正写起来并不容易 备注:本篇是以python3.6讲解的,python2会多一 ...

  3. 查找链表中倒数第k个结点

    题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNex ...

  4. BZOJ 2179 FFT快速傅立叶 题解

    bzoj 2179 Description 给出两个n位10进制整数x和y,你需要计算x*y. [题目分析] 高精裸题.练手. [代码] 1.手动高精 #include<cstdio> # ...

  5. 2013ACM-ICPC杭州赛区全国邀请赛——Random Walk

    pid=4579" style="background-color:rgb(51,255,51)">题目链接 题意: n个点.依照题中给的公式能够求出随意两个点转移 ...

  6. rqnoj-208-奥运火炬到厦门-dp

    这道题目是把一个连续的串看成一个环. 那么除了原始的求最大字段和外. 还存在一种情况是前面的连续最大值,加上后面的连续最大值. #include<stdio.h> #include< ...

  7. Qt Creator的安装与Qt交叉编译的配置

    Qt Creator 的安装 到Qt官网下载Qt Creator  https://www.qt.io/download-open-source/ 其它旧版本点击Achieve连接下载 或登录http ...

  8. 【属性动画示例】Property Animation

    MainActivity 属性动画常用操作 // 可操控的属性有:alpha:x/y:scaleX/scaleY:rotation/rotationX/rotationY:transitionX/tr ...

  9. [C#.NET] 使用 X509 數位電子簽章 加解密

    摘自: http://www.dotblogs.com.tw/yc421206/archive/2012/06/30/73150.aspx 上篇提到了使用X509的的憑證使用方式,請參考 [C#.NE ...

  10. mongodb pymongo.errors.CursorNotFound: Cursor not found, cursor id: 82792803897

    默认 mongo server维护连接的时间窗口是十分钟 默认 单次从 server获取数据是101条或者 大于1M小于16M的数据 所以默认情况下,如果10分钟内未能处理完数据,则抛出该异常. 解决 ...