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()

时间: 2024-11-03 21:23:29

EM 算法 实例的相关文章

EM算法实例

http://wenku.baidu.com/link?url=Kcy8tvgkji4trmoijvM2Drc5GsSFJorkIUy-t-vNyx-gGJrCr7-725rmygLWBnCdnxtCTHoLV4_-EMQhqHcRjB3K4JBMySugOrMlQyfokJW

机器学习中的EM算法详解及R语言实例(1)

最大期望算法(EM) K均值算法非常简单(可参见之前发布的博文),详细读者都可以轻松地理解它.但下面将要介绍的EM算法就要困难许多了,它与极大似然估计密切相关. 1 算法原理 不妨从一个例子开始我们的讨论,假设现在有100个人的身高数据,而且这100条数据是随机抽取的.一个常识性的看法是,男性身高满足一定的分布(例如正态分布),女性身高也满足一定的分布,但这两个分布的参数不同.我们现在不仅不知道男女身高分布的参数,甚至不知道这100条数据哪些是来自男性,哪些是来自女性.这正符合聚类问题的假设,除

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

一.机器学习中的參数预计问题 在前面的博文中,如"简单易学的机器学习算法--Logistic回归"中,採用了极大似然函数对其模型中的參数进行预计,简单来讲即对于一系列样本,Logistic回归问题属于监督型学习问题,样本中含有训练的特征 X_i" title="X_i" >以及标签.在Logistic回归的參数求解中.通过构造样本属于类别和类别的概率: 这样便能得到Logistic回归的属于不同类别的概率函数: 此时,使用极大似然预计便可以预计出模型

Expectation maximization (EM) 算法学习总结

原创博客,转载请注明出处 Leavingseason http://www.cnblogs.com/sylvanas2012/p/5053798.html EM框架是一种求解最大似然概率估计的方法.往往用在存在隐藏变量的问题上.我这里特意用"框架"来称呼它,是因为EM算法不像一些常见的机器学习算法例如logistic regression, decision tree,只要把数据的输入输出格式固定了,直接调用工具包就可以使用.可以概括为一个两步骤的框架: E-step:估计隐藏变量的概

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

不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmeans聚类(输入样本数据,输出样本数据的标注).实际上,高斯混和模型GMM和kmeans都是EM算法的应用. 在opencv3.0中,EM算法的函数是trainEM,函数原型为: bool trainEM(InputArray samples, OutputArray logLikelihoods=n

信息论、最大熵模型与EM算法

七月在线4月机器学习算法班课程笔记--No.8 1. 统计学习基础回顾 1.1 先验概率与后验概率 先验概率:根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现. 后验概率:依据得到"结果"信息所计算出的最有可能是那种事件发生,如贝叶斯公式中的,是"执果寻因"问题中的"因".后验概率可以根据通过贝叶斯公式,用先验概率和似然函数计算出来. 贝叶斯定理:假设B1,B2,...,

机器学习---EM算法(分类)

很多时候算法没有搞明白其实是一堆符号没有明白是神马意思...所以本文,着重告诉大家,这堆符号,到底都,代表神马! 我就奇怪了,谁发明了这么多符号(--多么希望是我-.- 以下使用到的图片来自上海交大杨旸老师的课件,网址如下:http://bcmi.sjtu.edu.cn/~yangyang/ml/ 我们首先来宏观认识一下EM算法.其实EMs就是K-means的升级版,也是就是说K-means是EM的一种特殊情况~相当于一个二维一个多维的关系 分割线前边讲算法,后边讲证明. 想知道K-means是

EM算法(1):K-means 算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解 EM算法(1) : K-means算法 1. 简介 K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成.这个类的个数一般是认为给定的. 2. 原理 假设给定一个数据集$\mathbf{X} = \{\mathbf{x}_1, \mathbf{x}_2,...,\mathbf{x}_N \}$, 和类的个数K.我们的每个类都用一个中心点$

EM算法(3):EM算法详解

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解