这篇文章给了我一个启发,我们可以自己用已知分布的密度函数进行组合,然后构建一个新的密度函数啦,然后用极大似然估计MLE进行估计。

代码和结果演示
代码:
  1. #取出MASS包这中的数据
  2. data(geyser,package="MASS")
  3. head(geyser)
  4. attach(geyser)
  5. par(bg='lemonchiffon')
  6. hist(waiting,freq=F,col="lightcoral")
  7. #freq=F要加上,否则就无法添加线了
  8. lines(density(waiting),lwd=2,col="cadetblue4")
  9. #根据图像,我们认为其在前后分别是两个正态分布函数的组合
  10. #定义 log‐likelihood 函数
  11. LL<-function(params,data){
  12. #参数"params"是一个向量,
  13. #依次包含了五个参数: p,mu1,sigma1,mu2,sigma2.
  14. #参数"data",是观测数据。
  15. t1<-dnorm(data,params[2],params[3])
  16. t2<-dnorm(data,params[4],params[5])
  17. #f是概率密度函数
  18. f<-params[1]*t1+(1-params[1])*t2
  19. #混合密度函数
  20. ll<-sum(log(f))
  21. #log‐likelihood 函数
  22. return(-ll)
  23. #nlminb()函数是最小化一个函数的值,
  24. #但我们是要最大化 log‐likeilhood 函数
  25. #所以需要在“ ll”前加个“ ‐”号。
  26. }
  27. #估计函数####optim####
  28. # debugonce(nlminb)
  29. geyser.res<-nlminb(c(0.5,50,10,80,10),LL,data=waiting,
  30. lower=c(0.0001,-Inf,0.0001,
  31. -Inf,0.0001),
  32. upper=c(0.9999,Inf,Inf,Inf,Inf))
  33. #初始值为 p=0.5,mu1=50,sigma1=10,mu2=80,sigma2=10
  34. #初始值也会被传递给LL
  35. #LL 是被最小化的函数。
  36. #data 是估计用的数据(传递给我们的LL)
  37. #lower 和 upper 分别指定参数的上界和下界。
  38. #查看拟合的参数
  39. geyser.res$par
  40. #拟合的效果
  41. #解释变量
  42. X<-seq(40,120,length=100)
  43. #读出估计的参数
  44. p<-geyser.res$par[1]
  45. mu1<-geyser.res$par[2]
  46. sig1<-geyser.res$par[3]
  47. mu2<-geyser.res$par[4]
  48. sig2<-geyser.res$par[5]
  49. #将估计的参数函数代入原密度函数。
  50. f<-p*dnorm(X,mu1,sig1)+(1-p)*dnorm(X,mu2,sig2)
  51. #作出数据的直方图
  52. hist(waiting,probability=T,col='lightpink3',
  53. ylab="Density",ylim=c(0,0.04),
  54. xlab="Eruption waiting times"
  55. )
  56. #画出拟合的曲线
  57. lines(X,f,col='lightskyblue3',lwd=2)
  58. detach(geyser)

调试的说明
nlminb函数:
nlminb(c(0.5,50,10,80,10),LL,data=waiting,
                   lower=c(0.0001,-Inf,0.0001,
                           -Inf,0.0001),
                   upper=c(0.9999,Inf,Inf,Inf,Inf))
  1. function (start, objective, gradient = NULL, hessian = NULL,
  2. ..., scale = 1, control = list(), lower = -Inf, upper = Inf)
  3. {
  4. par <- setNames(as.double(start), names(start))
  5. n <- length(par)
  6. iv <- integer(78 + 3 * n)
  7. v <- double(130 + (n * (n + 27))/2)
  8. .Call(C_port_ivset, 2, iv, v)
  9. if (length(control)) {
  10. nms <- names(control)
  11. if (!is.list(control) || is.null(nms))
  12. stop("'control' argument must be a named list")
  13. pos <- pmatch(nms, names(port_cpos))
  14. if (any(nap <- is.na(pos))) {
  15. warning(sprintf(ngettext(length(nap), "unrecognized control element named %s ignored",
  16. "unrecognized control elements named %s ignored"),
  17. paste(sQuote(nms[nap]), collapse = ", ")), domain = NA)
  18. pos <- pos[!nap]
  19. control <- control[!nap]
  20. }
  21. ivpars <- pos <= 4
  22. vpars <- !ivpars
  23. if (any(ivpars))
  24. iv[port_cpos[pos[ivpars]]] <- as.integer(unlist(control[ivpars]))
  25. if (any(vpars))
  26. v[port_cpos[pos[vpars]]] <- as.double(unlist(control[vpars]))
  27. }
  28. obj <- quote(objective(.par, ...))

  29. rho <- new.env(parent = environment())

  30. assign(".par", par, envir = rho)
  31. grad <- hess <- low <- upp <- NULL
  32. if (!is.null(gradient)) {
  33. grad <- quote(gradient(.par, ...))
  34. if (!is.null(hessian)) {
  35. if (is.logical(hessian))
  36. stop("logical 'hessian' argument not allowed. See documentation.")
  37. hess <- quote(hessian(.par, ...))
  38. }
  39. }
  40. if (any(lower != -Inf) || any(upper != Inf)) {
  41. low <- rep_len(as.double(lower), length(par))
  42. upp <- rep_len(as.double(upper), length(par))
  43. }
  44. else low <- upp <- numeric()
  45. .Call(C_port_nlminb, obj, grad, hess, rho, low, upp, d = rep_len(as.double(scale),
  46. length(par)), iv, v)
  47. iv1 <- iv[1L]
  48. list(par = get(".par", envir = rho), objective = v[10L],
  49. convergence = (if (iv1 %in% 3L:6L) 0L else 1L), iterations = iv[31L],
  50. evaluations = c(`function` = iv[6L], gradient = iv[30L]),
  51. message = if (19 <= iv1 && iv1 <= 43) {
  52. if (any(B <- iv1 == port_cpos)) sprintf("'control' component '%s' = %g, is out of range",
  53. names(port_cpos)[B], v[iv1]) else sprintf("V[IV[1]] = V[%d] = %g is out of range (see PORT docu.)",
  54. iv1, v[iv1])
  55. } else port_msg(iv1))
  56. }
par最先获得了初始值
obj <- quote(objective(.par, ...))
让obj表示一个名为objective,接受形参.par和...的函数,即我们传入的对数似然函数
rho <- new.env(parent = environment())
创建新环境
assign(".par", par, envir = rho)
将par赋给rho环境中的.par变量
.Call(C_port_nlminb, obj, grad, hess, 
        rho, low, upp, d = rep_len(as.double(scale), length(par)), iv, v)
C_port_nlminb在名为stats.dll的包里,我用reflector和VS都没能看到什么东西,唉,最关键的东西是缺失的。
此时rho包含了参数的初始值,而obj接受.par和多出来的data,即参数初始值和数据。
在nlminb函数的帮助文档里提到:
...
Further arguments to be supplied to objective.
即在这里是传递给对数似然函数的更多参数,这里是data,之所以LL的第一个参数不需要传入是因为我们在源码看到其是.par,也可以在帮助文档看到:
objective
Function to be minimized. Must return a scalar value. The first argument to objective is the vector of parameters to be optimized, whose initial values are supplied through start(start 参数). Further arguments (fixed during the course of the optimization) to objective may be specified as well (see ...(参数)).

---------------------------------------
参考:
原文档:

附件列表

补充资料——自己实现极大似然估计(最大似然估计)MLE的更多相关文章

  1. 最大似然估计(Maximum Likelihood,ML)

    先不要想其他的,首先要在大脑里形成概念! 最大似然估计是什么意思?呵呵,完全不懂字面意思,似然是个啥啊?其实似然是likelihood的文言翻译,就是可能性的意思,所以Maximum Likeliho ...

  2. 最大似然估计 (MLE)与 最大后验概率(MAP)在机器学习中的应用

    最大似然估计 MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即“模型已定,参数未知”. 例如,对于线性回归,我们假定样本是服从正态分布,但是不知道 ...

  3. 【模式识别与机器学习】——最大似然估计 (MLE) 最大后验概率(MAP)和最小二乘法

    1) 极/最大似然估计 MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即“模型已定,参数未知”.例如,我们知道这个分布是正态分布,但是不知道均值和 ...

  4. 最大似然估计 (MLE) 最大后验概率(MAP)

    1) 最大似然估计 MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即"模型已定,参数未知". 例如,我们知道这个分布是正态分布 ...

  5. 深度学习中交叉熵和KL散度和最大似然估计之间的关系

    机器学习的面试题中经常会被问到交叉熵(cross entropy)和最大似然估计(MLE)或者KL散度有什么关系,查了一些资料发现优化这3个东西其实是等价的. 熵和交叉熵 提到交叉熵就需要了解下信息论 ...

  6. 机器学习的MLE和MAP:最大似然估计和最大后验估计

    https://zhuanlan.zhihu.com/p/32480810 TLDR (or the take away) 频率学派 - Frequentist - Maximum Likelihoo ...

  7. 最大似然估计和最大后验概率MAP

    最大似然估计是一种奇妙的东西,我觉得发明这种估计的人特别才华.如果是我,觉得很难凭空想到这样做. 极大似然估计和贝叶斯估计分别代表了频率派和贝叶斯派的观点.频率派认为,参数是客观存在的,只是未知而矣. ...

  8. 似然函数 | 最大似然估计 | likelihood | maximum likelihood estimation | R代码

    学贝叶斯方法时绕不过去的一个问题,现在系统地总结一下. 之前过于纠结字眼,似然和概率到底有什么区别?以及这一个奇妙的对等关系(其实连续才是f,离散就是p). 似然函数 | 似然值 wiki:在数理统计 ...

  9. 机器学习基础系列--先验概率 后验概率 似然函数 最大似然估计(MLE) 最大后验概率(MAE) 以及贝叶斯公式的理解

    目录 机器学习基础 1. 概率和统计 2. 先验概率(由历史求因) 3. 后验概率(知果求因) 4. 似然函数(由因求果) 5. 有趣的野史--贝叶斯和似然之争-最大似然概率(MLE)-最大后验概率( ...

随机推荐

  1. vs code中文扩展包

    vs code 中文拓展安装失败时,可以手动下载安装,下载对版本的中文包. https://marketplace.visualstudio.com/_apis/public/gallery/publ ...

  2. C语言之指针若干问题

    1.指针变量的赋值问题. 常常有偷懒的小伙子,这样赋值 int *Pointer =  3:/ 这是给Pointer 所指的变量赋值,刚创建Pointer时,它所指的变量是不固定的,可能是某个重要的系 ...

  3. Python3.0科学计算学习之绘图(二)

    (1) np.mashgrid()函数:-----生成网络点坐标矩阵,可以是二维网络矩阵,也可以是三维网络矩阵.其中,每个交叉点就是网络点,描述这些网络点的矩阵就是坐标矩阵(横坐标矩阵X中的每个元素与 ...

  4. 北京大学Cousera学习笔记--1-学习规划

    1.计算机导论与C语言基础 1>.计算导论:计算机的基本原理.计算机的发展趋势.程序运行的基本原理 2>.C程序设计:感性认识C程序.理性认识C程序:机构化的程序-函数.更多的数据结构 2 ...

  5. vs2017 git凭证问题

    安装完tfs2017(自带git)后,连接git代码服务器,报authorication错误.这是vs2017的bug.尝试了许多种方案后,最简单的干脆手动添加如下3个凭证.一定要核对好地址中的.  ...

  6. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  7. TCP三次握手及TCP连接状态 TCP报文首部格式

    建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...

  8. 装饰者模式 Decorator

    项目:咖啡计费系统 背景:现有系统中有一个抽象类Beverage,有2个抽象方法GetDescription和Cost. namespace DecoratorPattern { /// <su ...

  9. oracle修改审计功能

    oracle修改审计功能 如果没有关闭审计功能,审计日志文件默认保存在位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/ 关闭审计:alter system set au ...

  10. (cvpr 2018)Technology details of SMRD

    1.摘要 近年来,深度卷积神经网络(CNN)方法在单幅图像超分辨率(SISR)领域取得了非常大的进展.然而现有基于 CNN 的 SISR 方法主要假设低分辨率(LR)图像由高分辨率(HR)图像经过双三 ...