前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >待完善 | R语言 | 优化函数 | optimize,optimise,optim

待完善 | R语言 | 优化函数 | optimize,optimise,optim

作者头像
努力在北京混出人样
发布2019-02-18 17:26:40
3.6K0
发布2019-02-18 17:26:40
举报
文章被收录于专栏:祥子的故事祥子的故事

R语言中,常用的优化函数知多少,这次将介绍optimize,optimise,optim这三个做优化的函数,也是目前最常用到的优化函数。

做一元的优化:只有要给参数 optimize,optimise,此外,optim也可以做一元优化。前面两个较为常用些。

这两个函数的用法是相同的,先给定函数,指定参数的取值函数,再从取值范围中优化,对于凸函数,能够取到全局最优解,对于非凸函数,可能取到局部最优解。

函数

代码语言:javascript
复制
optimize(f, interval, ..., lower = min(interval), upper = max(interval),
         maximum = FALSE,
         tol = .Machine$double.eps^0.25)
optimise(f, interval, ..., lower = min(interval), upper = max(interval),
         maximum = FALSE,
         tol = .Machine$double.eps^0.25)

这里,f表示函数,interval是取值的区间,lower是区间下界,upper是区间上界,maximum用于指定是最大优化问题还是最小优化问题,tol是计算的精度设置。

=====================

该区域用于描述optimize和optimise函数的核心优化思想,待下次完善。 关键点:以供下次注意理解点。

代码语言:javascript
复制
The first evaluation of f is always at x_1 = a + (1-φ)(b-a) where (a,b) = (lower, upper) and phi = (sqrt(5) - 1)/2 = 0.61803.. is the golden section ratio. Almost always, the second evaluation is at x_2 = a + phi(b-a). Note that a local minimum inside [x_1,x_2] will be found as solution, even when f is constant in there, see the last example.

=====================

案例学习: 第一类:凸问题

代码语言:javascript
复制
f <- function (x) (x - 1/3)^2
plot(f,xlim = c(0,1))
这里写图片描述
这里写图片描述
代码语言:javascript
复制
xmin <- optimize(f, c(0, 1), tol = 0.0001)
xmin

结果

代码语言:javascript
复制
$minimum
[1] 0.3333333

$objective
[1]0

极小值时,x取值为0.3333333 ,函数的值为0

第二种,非凸问题

代码语言:javascript
复制
f=function(x) x*sin(10*pi*x)+1
curve(f,xlim=c(-2,1))
这里写图片描述
这里写图片描述

从图来看,是波动的,存在好多极小值或极大值。

代码语言:javascript
复制
optimize(f,c(-2,1),tol=0.0001,maximum=T)

结果

代码语言:javascript
复制
$maximum
[1] -1.050968

$objective
[1] 2.050482

当函数取最大值时,它对应的x取值为-1.050968,显然在-2到1的范围内,非最佳的极大值。此时,对应的目标函数为2.050482.

多元优化问题,即存在多个参数待求解。 optim函数,对于多个参数的多元优化,设置为theta一个参数,取theta1 = theta[1],theta2 = theta[2],…依次类推。

函数,有两个

代码语言:javascript
复制
optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
                 "Brent"),
      lower = -Inf, upper = Inf,
      control = list(), hessian = FALSE)

optimHess(par, fn, gr = NULL, ..., control = list())

对于多元的,它的求解难度较大,涉及到的优化算法很多,对于不同类型的算法,其适用范围也有所不一样。

这里暂时给出demo,下次再来完善。

代码语言:javascript
复制
require(graphics)

fr <- function(x) {   ## Rosenbrock Banana function
    x1 <- x[1]
    x2 <- x[2]
    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
代码语言:javascript
复制
optim(c(-1.2,1), fr)

初始值为-1.2和1

代码语言:javascript
复制
$par
[1] 1.000260 1.000506

$value
[1] 8.825241e-08

$counts
function gradient 
     195       NA 

$convergence
[1] 0

$message
NULL

计算得到的参数最佳结果为1.000260和1.000506。

注意:需要完善的有

  • optimize
  • optimise
  • optim
  • optimHess
  • 优化算法的适用范围:”Nelder-Mead”,”BFGS”,”CG”,”L-BFGS-B”,”SANN”,”Brent”
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档