(R语言)不依赖求导的寻根方法:Nelder-Mead方法

牛顿法需要一阶和二阶导数,如果导函数不可用,则可以通过伪牛顿(Quasi-Newton)方法近似它们。如果导函数直接不存在怎么办?函数中存在不连续则可能发生这种情况。

Nelder-Mead Method

在Nelder-Mead算法下即使函数不连续,Nelder-Mead算法也是十分稳健的,该算法是基于评估n维单纯形的顶点处的函数,其中n是函数中输入变量的数量(在这里我只写计算二维问题的算法)。对于二维问题,n维单纯形只是一个三角形,每个角的一个顶点,通常有n+1个顶点。


下面是算法的具体步骤:
Step1: 下面为三个初始值点X(1)=(x1,x2)X(1) = (x_1,x_2)X(1)=(x1​,x2​) X(2)=(x3,x4)X(2) = (x_3,x_4)X(2)=(x3​,x4​) X(3)=(x5,x6)X(3) = (x_5,x_6)X(3)=(x5​,x6​)
将上述三个初始值点代入函数f(x)f(x)f(x)中,即f(X1)f(X_1)f(X1​)、f(X2)f(X_2)f(X2​)、f(X3)f(X_3)f(X3​),再对它们进行排序,假设三个初始值代入的大小排序为:f(X1)≤f(X2)≤f(X3)f(X_1)\leq f(X_2)\leq f(X_3)f(X1​)≤f(X2​)≤f(X3​)
Step2: 计算这三个点的中心点 X(0)=∑i=1nXinX(0) = \frac {\sum_{i=1}^n X_i} {n}X(0)=n∑i=1n​Xi​​
Step3: 计算对称点 X(r)=X(0)+α(X(0)−X(3))X(r) = X(0) + \alpha(X(0)-X(3))X(r)=X(0)+α(X(0)−X(3))
通常情况下α\alphaα取1

Case1: f(X1)≤f(Xr)≤f(X3)f(X_1)\leq f(X_r) \leq f(X_3)f(X1​)≤f(Xr​)≤f(X3​)此时XrX_rXr​不是最优点也不是最差点,用XrX_rXr​取代X3X_3X3​,新的三个构造点变为X1X_1X1​,X2X_2X2​,XrX_rXr​,回到Step1,继续进行迭代运算。

Case2: f(Xr)&lt;f(X1)f(X_r) &lt; f(X_1)f(Xr​)<f(X1​)
此时XrX_rXr​是最优点,一个好的方向被找出,沿着此方向再找出点XeX_eXe​:
Xe=X0+γ(Xr−X0)X_e = X_0 + \gamma (X_r - X_0)Xe​=X0​+γ(Xr​−X0​)
通常情况下γ\gammaγ取2
计算f(Xe)f(X_e)f(Xe​),当f(Xe)&lt;f(Xr)f(X_e) &lt; f(X_r)f(Xe​)<f(Xr​)时,扩展点是优于对称点的,此时用X1X_1X1​、X2X_2X2​、XeX_eXe​构造;当f(Xr)≤f(Xe)f(X_r) \leq f(X_e)f(Xr​)≤f(Xe​)时,对称点是优于扩展点的,此时用X1X_1X1​、X2X_2X2​、XrX_rXr​构造,然后回到Step1。

Case3: f(Xr)≥f(X3)f(X_r) \ge f(X_3)f(Xr​)≥f(X3​)
此时XrX_rXr​是最差点,需要构造收缩点XcX_cXc​:
Xc=X0+ρ(X3−X0)X_c = X_0 + \rho (X_3 - X_0)Xc​=X0​+ρ(X3​−X0​)
计算f(Xc)f(X_c)f(Xc​),当f(Xc)&lt;f(X3)f(X_c) &lt; f(X_3)f(Xc​)<f(X3​)时,此时用X1X_1X1​、X2X_2X2​、XcX_cXc​构造;当f(X3)≤f(Xc)f(X_3) \leq f(X_c)f(X3​)≤f(Xc​)时,构造新的X2′X_2'X2′​和X3′X_3'X3′​:
X2′=X1+δ(X2−X1)X_2' = X_1 + \delta (X_2 - X_1)X2′​=X1​+δ(X2​−X1​) X3′=X1+δ(X3−X1)X_3' = X_1 + \delta (X_3 - X_1)X3′​=X1​+δ(X3​−X1​)
通常情况下ρ\rhoρ和δ\deltaδ取0.5
此时用X1X_1X1​、X2′X_2'X2′​、X3′X_3'X3′​构造,然后回到Step1。

R代码

此代码还具备了生成GIF图的功能,有兴趣的朋友可以了解animation这个包,里面有很多很有趣的函数。

setwd("/Users/Desktop/R programs")
png("NelderMead%03d.png")
library(animation)
NelderMead <- function(X, fun, alpha = 1, gamma = 2, lo = 0.5, mu = 0.5, eps = 10^(-8), max.loop = 50)
{i <- 1#build a empty vector to store iterative triangle area area.hist <- vector(mode = "numeric", length = 0)area.hist[1] <- 1#eps is the absolute convergence criterion for triangle areawhile((i <= max.loop) & (area.hist[i] > eps)){i <- i + 1x1 <- X[1,1]x2 <- X[1,2]fx.1 <- eval(fun)x1 <- X[2,1]x2 <- X[2,2]fx.2 <- eval(fun)x1 <- X[3,1]x2 <- X[3,2]fx.3 <- eval(fun)FX <- c(fx.1, fx.2, fx.3)x.x <- X[,1]y.y <- X[,2]plot(X[,1], X[,2], xlim = c(-1,2), ylim = c(-1,2), xlab = "x", ylab = "y", main = "Nelder-Mead Iteration", pch = 20, cex = 0.5)lines(rbind(c(X[1,1],X[1,2]), c(X[2,1],X[2,2]), c(X[3,1],X[3,2]), c(X[1,1],X[1,2])))#Get the index of the maximum and minimum、median values in FXmaximum <- match(max(FX), FX)median <- match(median(FX), FX)minimum <- match(min(FX), FX)#X0: Centriod of the remaining n pointsX0 <- c(sum(X[1,1]+X[2,1]+X[3,1])/3, sum(X[1,2]+X[2,2]+X[3,2])/3)#Xr: Reflected pointXr <- c(X0[1]+alpha*(X0[1]-X[maximum,1]), X0[2]+alpha*(X0[2]-X[maximum,2]))x1 <- Xr[1]x2 <- Xr[2]fx.xr <- eval(fun)if((FX[minimum] <= fx.xr) && (fx.xr < FX[maximum])){X[maximum,1] <- Xr[1]X[maximum,2] <- Xr[2]p <- matrix(c(X[1,1],X[1,2],1,X[2,1],X[2,2],1,X[3,1],X[3,2],1), nrow = 3, byrow = TRUE)area.hist[i] <- abs(0.5*det(p))}else if(fx.xr < FX[minimum]){Xe <- c(X0[1]+gamma*(Xr[1]-X0[1]), X0[2]+gamma*(Xr[2]-X0[2]))x1 <- Xe[1]x2 <- Xe[2]if(eval(fun) < fx.xr){X[maximum,1] <- Xe[1]X[maximum,2] <- Xe[2]p <- matrix(c(X[1,1],X[1,2],1,X[2,1],X[2,2],1,X[3,1],X[3,2],1), nrow = 3, byrow = TRUE)area.hist[i] <- abs(0.5*det(p))}else{X[maximum,1] <- Xr[1]X[maximum,2] <- Xr[2]p <- matrix(c(X[1,1],X[1,2],1,X[2,1],X[2,2],1,X[3,1],X[3,2],1), nrow = 3, byrow = TRUE)area.hist[i] <- abs(0.5*det(p))}}else if(fx.xr >= FX[maximum]){Xc <- c(X0[1]+lo*(X[maximum,1]-X0[1]), X0[2]+lo*(X[maximum,2]-X0[2]))x1 <- Xc[1]x2 <- Xc[2]if(eval(fun) < FX[maximum]){X[maximum,1] <- Xc[1]X[maximum,2] <- Xc[2]p <- matrix(c(X[1,1],X[1,2],1,X[2,1],X[2,2],1,X[3,1],X[3,2],1), nrow = 3, byrow = TRUE)area.hist[i] <- abs(0.5*det(p))}else{X[maximum,1] <- X[minimum,1]+mu*(X[maximum,1]-X[minimum,1])X[maximum,2] <- X[minimum,2]+mu*(X[maximum,2]-X[minimum,2])X[median,1] <- X[minimum,1]+mu*(X[median,1]-X[minimum,1])X[median,2] <- X[minimum,2]+mu*(X[median,2]-X[minimum,2])p <- matrix(c(X[1,1],X[1,2],1,X[2,1],X[2,2],1,X[3,1],X[3,2],1), nrow = 3, byrow = TRUE)area.hist <- abs(0.5*det(p))}}}return(list(Point_coordinates = X, Area = area.hist, Iteration = i))
}#by the result, we can find the different initial value lead to different convergence result
X <- matrix(c(1,1,2,1,2,2), nrow = 3)
out <- NelderMead(X, expression(x1^2 + x2^2))
dev.off()
out
bm.files <- sprintf("NelderMead%03d.png", 1:25)
im.convert(files = bm.files, output = "NelderMead.gif")

—————————未经允许,谢绝转载—————————

R语言)不依赖求导的寻根方法:Nelder-Mead方法相关推荐

  1. 多项式乘积求导 c语言,c语言实现多项式求导.docx

    c语言实现多项式求导 #include #include//动态申请空间的函数的头文件typedef struct node //定义节点类型{ float coef; //多项式的系数 int ex ...

  2. R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值

    R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier).输出异常值对应的统计量.p值以及Bonferonnii校正p值 目录

  3. 大数据----------------R语言下依赖库与依赖包的安装

    由于博主最近在学习大数据的基础,避免不了要搭建以hadoop,hbase,hive等软件为基础的环境,这一路的bug可谓是层出不穷啊!在历经万苦后终于将前面的都安装好了,顺利了一会儿,没想到在数据可视 ...

  4. R语言学习笔记 ②求一组数据的平均数、中位数、标准差和范围

    以作业为例 1. 求平均数 mean R语言用函数 mean() 来求平均数 # Create a vector. x <- c(15, 8, 6, 9, 9, 4, 18, 10, 12, 1 ...

  5. 如何用c语言对隐函数求导,隐函数求导的方法

    隐函数如何求导,隐函数求导的方法有是什么?不了解的小伙伴们看过来.下面由出国留学网小编为你精心准备了"隐函数求导的方法是什么?",持续关注本站将可以持续获取更多的考试资讯! 隐函数 ...

  6. R语言---安装依赖包

    R环境:R x64 4.0.3 在此以readxl包为例: 安装方法一: 1.打开R x64 4.0.3,使用  install.packages("readxl");   默认安 ...

  7. R语言安装包,安装Github包的三种方法

    以安装Github上的Achilles包为例进行安装说明. 描述 1.安装包路径:https://github.com/OHDSI/Achilles#getting-started 2.该包功能:进行 ...

  8. R 语言 用黎曼和求近似 积分

    定积分--求解面积的思路 简言之,用小矩形面积的和逼近. 黎曼积分求解思路 这个思路很好理解,简单来说分成四步:先分割,再求每个矩形面积,再求和,最后取极限. 我们一步一步来引出黎曼积分. ∫ − 4 ...

  9. R语言 去掉NA求均值

    数据里面有很多NA,去掉NA再对每列求均值怎么求呢? 这里用到的是dyplr包 a <- data.frame(a = c(1,2,NA,3),b = c(1,3,4,5),d=c(NA,1,2 ...

最新文章

  1. go语言中的float类型
  2. Python 学习笔记(3)对txt文件的读与写操作(下)
  3. php实现sql server数据导入到mysql数据库_php实现SQL Server数据导入Mysql数据库(示例)...
  4. Linux 创建指定大小空文件
  5. Windows 8的无线设置后,竟不能直接更改,目前知道可以通过命令行解决
  6. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
  7. 构建前端自动化工作流环境
  8. FBI树(信息学奥赛一本通-T1365)
  9. java object怎么拿字段_「Java面试秘籍」String不可变,如何理解
  10. 全面接触PDF:最好用的PDF软件汇总
  11. OC 获取view相对位置_【黑苹果系列】小白教程之DSD补丁篇 | 7分钟教你优雅定制最关键的OC补丁(clover通用)...
  12. excel处理html文件,html网页显示excel表格数据-html读取本地excel文件并展示
  13. 局域网在线计算机扫描仪,局域网内也共享扫描仪
  14. matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
  15. Linux下基于TCP的视频传输(c++ )
  16. JAVA系统蓝屏_Tomcat启动系统蓝屏
  17. 程序员学习资料分享---爱分享的程序员(新浪微博)
  18. 假设检验实例(python)
  19. 【文印技巧】明明选了黑白打印,却印出了棕红色,怎么解决?
  20. python批量评论_手把手教你 Python挖掘用户评论典型意见并自动生产报告

热门文章

  1. 软件测试自我评价范文,软件测试工程师自我评价范文
  2. ISMS整体项目进度表
  3. 【嵌入式】GPIO驱动LED设计
  4. web网站服务器宕机应急,web服务器的宕机诊断方法
  5. Idea集成单元测试JUnit
  6. ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
  7. 地域环境对就业的影响_地域对于职业发展的影响
  8. 【时空】冰与火之歌一文弄懂时间复杂度与空间复杂度
  9. 搬:90 个名企笔试题和算法题
  10. 数据库完整性之参照完整性