`
penergy
  • 浏览: 39947 次
社区版块
存档分类
最新评论

R语言: MLE以及EM算法模拟实验

阅读更多
看了一篇来自zouxy09的“从最大似然到EM算法浅解”博文

详细算法和数学公式在 http://blog.csdn.net/zouxy09

本文主要想实现上述文中的例子:例子简要描述。

某学校抽样100位男生和100位女生的身高,男生和女生身高分别满足各自的高斯分布。现在200个样本数据混乱放置在一起,如何通过EM算法,求出男生身高的均值和标准差?

首先,我们模拟男女生身高样本。模拟男生theta值为mu=1.75, sd=0.316。女生theta值为mu=1.65, sd=0.316
#Data simulation
set.seed(1001)
mStudent<-rnorm(100,1.75,0.316)
fStudent<-rnorm(100,1.65,0.316)
totalStu<-cbind(mStudent,fStudent)
totalStu1<-c(mStudent,fStudent)


按照EM算法步骤,E-Step. 对hidden vairiable (z)进行估计,把男生和女生分成两类。
###################
#E-step:
###################
eStep.fn=function(data,flag, muB,sigmaB,muG,sigmaG){
  listB = c()
  listG = c()
  numB=0
  numG=0
  for(i in 1:200){
    testB<-dnorm(data[i],muB,sigmaB)
    testG<-dnorm(data[i],muG,sigmaG)
    pb=testB/(testB+testG)
    pg=testG/(testB+testG)
    if(pb>=pg){
      numB=numB+1
      listB[numB]=data[i]
    }else{
      numG=numG+1
      listG[numG]=data[i]
    }
  }
  if(flag==1){
    return (listB)
  }else
    return (listG)
}



接着, M-Step: 对特定的男生类,或者女生类进行MLE估计
#log-likelihood function
set.seed(1001)
LL.fn <- function(mu, sigma) {
      R = suppressWarnings(dnorm(data, mu, sigma)) 
      -sum(log(R))
}

# Maximum likelihood Estimator
mle(LL.fn, start = list(mu = 1, sigma=1))



最后上EM 算法
#####################
# Iteration
#####################
itr.fn=function(data,muIniB,sigmaIniB,muIniG,sigmaIniG,itrNum){
  #E-step
  dataB<-eStep.fn(data,1,muIniB,sigmaIniB,muIniG,sigmaIniG)
  dataG<-eStep.fn(data,2,muIniB,sigmaIniB,muIniG,sigmaIniG)
  #Redefine LL function
  #log-likelihood function
  LLB.fn <- function(mu, sigma) {
      R = suppressWarnings(dnorm(dataB, mu, sigma)) 
      -sum(log(R))
  }
  LLG.fn <- function(mu, sigma) {
    R = suppressWarnings(dnorm(dataG, mu, sigma)) 
    -sum(log(R))
  }
  # Maximum likelihood Estimator
  b.mle.coefs<-mle(LLB.fn, start = list(mu=muIniB, sigma=sigmaIniB))
  g.mle.coefs<-mle(LLG.fn, start = list(mu=muIniG, sigma=sigmaIniG))
  b.muItr<-coef(b.mle.coefs)[["mu"]]#coef(mle.test)[["mu"]]
  b.sigmaItr<-coef(b.mle.coefs)[["sigma"]]
  g.muItr<-coef(g.mle.coefs)[["mu"]]#coef(mle.test)[["mu"]]
  g.sigmaItr<-coef(g.mle.coefs)[["sigma"]]
  itrNum=itrNum-1
  #Iteration-step
  if(itrNum==0){
    return (c(coef(b.mle.coefs),coef(g.mle.coefs)))
  }else{
    itr.fn(data,b.muItr,b.sigmaItr,g.muItr,g.sigmaItr,itrNum)
  }
}


最后结果
itr.fn(totalStu1,1.8,1,1.6,1,n)#n为迭代的次数。


迭代三次,就开始收敛。但是效果不好,下面是结果
bmu           bsigma           gmu             gsigma
1.9658193 0.2170255     1.4610679   0.1583682
对比模拟值:theta值为mu=1.75, sd=0.316。女生theta值为mu=1.65, sd=0.316

下面是简单地思考,在E-step的过程中,由于两个分布重叠部分较大,所以考虑这样在使用R语言求dnorm时,分类情况如下,男生的身高均值在1.96,女生则在1.46。

下一步考虑如何去除这个干扰。。。本篇未完,待续。。。。

参考:
http://www.r-bloggers.com/fitting-a-model-by-maximum-likelihood/
http://xccds1977.blogspot.de/2012/08/emr.html
分享到:
评论
1 楼 hellodmp 2014-09-13  
我觉得你的代码实现有点问题,其中的rij并不是一个0-1的分布,而是一个概率吧

相关推荐

    EM算法课件讲义

    总结以上知识点,EM算法课件讲义中涵盖了最大似然估计、Jensen不等式、K-means算法、高斯分布参数估计、高斯混合模型以及坐标上升算法等重要概念,并通过实例演示的方式让学习者能够快速掌握EM算法的理论与实践应用...

    基于EM算法的极大似然分布式量化估计融合新方法.pdf

    仿真实验是通过计算机模拟的实验来验证理论分析或算法性能的手段。本文通过仿真实验验证了新方法的有效性,并与理想信道条件下的估计方法进行了性能对比。实验表明,在局部传感器观测样本数目大于5000和信噪比大于...

    EM_towcoins_机器学习_EMpython_

    - 两个硬币问题是一个经典的EM算法示例,模拟了两种不同概率的硬币抛掷,其中一种硬币正面朝上的概率较高,另一种较低。 2. **EM算法的步骤** - E步骤:在当前参数下,计算每个数据点属于每个类别的概率,即责任...

    Monte Carlo EM梯度法在MATLAB中的实现.pdf

    通过上述信息,我们了解了空间广义线性混合模型的应用背景、MATLAB在参数估计中的实现方法、蒙特卡洛方法与EM算法的结合、以及空间数据分析中克里格插值法的重要作用。这些内容对于理解空间统计学、数据分析以及...

    emgmm.zip_Maximum Expectation_最大似然估计_期望_楂樻柉娣峰悎妯″瀷_高斯混合模型 去噪

    它负责串联整个去噪过程,包括数据的读取、模型参数的初始化、EM算法的迭代执行,以及最终去噪结果的输出。通过这一流程,用户可以深入理解最大似然估计和期望最大化算法在高斯混合模型去噪中的实际应用。 总结而言...

    基于python的改进高斯混合模型的图割算法研究源码数据库.docx

    在高斯混合模型中,EM算法通过交替执行E步(期望步骤)和M步(最大化步骤)来逐步优化模型参数,直至收敛。 综上所述,基于Python的改进高斯混合模型的图割算法是一个综合了统计学习和图论的复杂系统。通过对关键...

    Maximum-Likelihood Array Processing in Non-Gaussian Noise with Gaussian Mixtures

    根据给定的文件标题、描述、标签以及部分内容,我们可以从中提炼出以下相关的IT知识点: ### 一、最大似然阵列处理(Maximum-Likelihood Array Processing) #### 1.1 定义 最大似然估计(Maximum Likelihood ...

    matlab-GMM模型参数估计的matlab仿真-源码

    EM算法是最常用的,包括E步(期望步)和M步(最大化步)。在E步中,我们计算每个数据点属于每个高斯分量的概率;在M步中,我们更新高斯分量的参数以最大化后验概率。MATLAB的`fitgmdist`函数默认采用EM算法进行参数...

    07-2-采样.pptx

    EM算法通过迭代地期望(E)步骤和最大化(M)步骤来处理这些隐藏信息,逐步改进参数估计。E步骤通过当前参数估计隐变量的期望值,M步骤则用这些期望值来更新参数。 6. 蒙特卡洛数值积分与采样: 在面对复杂的积分...

    HMM的学习问题和解码问题研究.pdf

    传统上,HMM参数的训练使用的是极大似然估计(MLE)或者Baum-Welch算法(一种特殊的EM算法),但是这些传统方法容易陷入局部最优解,并且当面临带有约束的优化问题时,如非负约束和概率和为一的约束,传统优化方法...

    多元混合指数分布的参数估计 (2007年)

    在处理多元混合指数分布参数估计时,EM算法可以有效处理正常应力下的完全数据以及Ⅰ型截尾和Ⅱ型截尾数据。 在进行多元混合指数分布参数估计之前,了解指数分布和混合分布是非常关键的。指数分布是一种连续概率分布...

    鹰公关

    HawkPR.m:EM算法的主要功能。 Hawkes_Sim_Corona.m:估计后模拟Hawkes进程。 updatep.m:预期步骤。 relative_hawkes.m:离散化模拟结果。 快速运行 使用MLE估计形状和比例参数进行威布尔分布 HawkPR('./ input_...

    stable分布的概率密度函数、参数估计、随机数产生以及累计密度函数

    对于稳定分布,由于没有封闭形式的极大似然估计(Maximum Likelihood Estimation, MLE),通常使用数值方法如模拟退火或期望最大化(Expectation-Maximization, EM)算法来估计。 在MATLAB中,可以使用一些工具箱...

    高斯混合模型:模拟高斯混合模型-matlab开发

    EM算法是一种迭代方法,旨在最大化似然函数,从而找到最佳的高斯分布参数。 然后,我们可以用`predict`函数来对新的观测数据进行聚类: ```matlab newData = ...; % 新的观测数据 labels = predict(gmmModel, new...

    matlab开发-fitparcopulagdata

    在高斯copula的情况下,这涉及到解决一个非线性方程组,通常通过迭代算法,如牛顿法或期望最大化(Expectation-Maximization, EM)算法实现。 4. **使用示例**: - 首先,你需要加载数据并计算Kendall's τ或...

    Algebraic Statistics for Computational Biology.pdf

    在生物信息学领域,EM算法被广泛应用于基因表达数据分析、蛋白质序列比对等多个方面。 **1.4 马尔可夫模型** 马尔可夫模型是一类广泛应用于序列数据分析的概率模型,特别是在处理时间序列数据时非常有效。这部分...

    具有退化状态和速率下的再生现象的电池寿命估算

    - Expectation conditional estimation (ECM):期望条件估计是一种统计优化算法,用于在缺失数据或不完全数据的情况下估计参数,它是期望最大化(EM)算法的一种变体。 - First passage time (FPT):首次通过时间...

Global site tag (gtag.js) - Google Analytics