R中最优化函数optim

最优化函数optim

目标函数:

$$f(x_1,x_2)=(1-x_1)^2+100(x_2-x_1^2)^2$$算法

该函数全局最小值在($x_1=1,x_2=1$)时取到。函数

下面这种写法是由于有多个自变量函数,传入一个参数x,每一个自变量用向量x的份量来表示,从而定义出目标函数。优化

obj <- function(x){
  x1 <- x[1]
  x2 <- x[2]
  y <- 100*(x2-x1^2)^2+(1-x1)^2
  return(y)
}

x1梯度:$-400*x_1*(x_2-x_1^2)-2*(1-x_1)$spa

x2梯度:$200*(x_2-x_1^2)$code

梯度blog

gradient <- function(x){
  x1 <- x[1]
  x2 <- x[2]
 c(x1_gradient = -400*x1*(x2-x1^2)-2*(1-x1),
   x2_gradient =200*(x2-x1^2))
}

tip:对于多元函数,须要用向量的形式来输出各个变量上的梯度。图片

下面以$x_1=0,x_2=3$做为起始点,其余参数采用默认设置,梯度也不输入。(默认时优化算法为单纯型法)ip

optim(par = c(0,3),fn=obj)

图片描述

  • par元素表示最优解取值
  • value值表示目标函数值
  • counts表明调用目标函数与梯度函数的数目,可认为是迭代数目
  • convergence是收敛的代码字符串

    • 0表示成功完成了优化任务
    • 1表示达到了达到了迭代上限而退出,关于迭代上限会在control参数的maxit元素进行说明
    • 10表示退化(退化表示单纯型没法继续移动)的单纯型
    • 51专指优化算法为L-BFGS-B的时候输出的警告信息。(L-BFGS-B为拟牛顿改进方法)
    • 52专指优化算法为L-BFGS-B的时候输出的错误信息。

optim函数参数详解

  • par:表示各变量的初始值,经过向量传入。对于不少算法,初始值很是重要,所以在具体的优化问题中若是能找到最优解附近的初始值(好比以前的经验)传入优化函数,将能大大的加强优化的效率。若是没有合适的初始值,能够选择任意的向量传入。
  • fn:目标函数
  • gr:梯度函数
  • method:优化方法,经过字符串形式传入,表示优化求解的算法,数学

    • Nelder-Mead:单纯型法,为optim默认优化算法。

      • 思想:经过单纯型的方式不断替换函数的最差的顶点从而获得最优值。由于没有用的梯度故不是很是有效,但方法十分稳健,效率也不低,所以被做为默认算法。
    • CG:是一种共轭梯度法,这种方法充分利用函数的梯度信息,在每一点都能找到一个最合适的方向(相似的算法是最速降低法,直接按照目标函数值最快的降低方向来搜索)来搜索,该方法的方向不必定是降低的方向,所以能避免陷入局部最优的困境。
    • BFGS:是一种拟牛顿法,也称变尺度法。该算法改进了牛顿法中容易受初值的影响的弱点,可是又不须要在每一步优化的过程当中计算精确的hessian矩阵及其逆矩阵,在具有牛顿法搜索快的特性的基础上又能有效的搜索全局最优解,一次使用十分普遍,是optim函数中应用最广的算法。
    • L-BFGS-B:是对BFGS算法的一个优化,可以在优化的同时增长箱型约束条件,必定程度上加强了这些无约束的非线性规划方法的功能。
    • SANN是一种模拟退火的方法,与一般的数学函数的算法不一样,该算法是一种几率算法,对于各类复杂的状况,尤为是不少不可微的函数,该算法能够找到最优解,但效率上比不上其余数学算法。
    • Brent算法是一种简单的一维搜索算法,一般被其余函数调用,实际使用中几乎不用。
  • lower:当算法选择为L-BFGS-B时,该函数容许传入简单的箱式约束,也就是说变量大于某个实数且小于某个实数,lower表示下界,upper表示上界,都是经过这个传入的。
  • upper:参见lower
  • control:该参数是一个列表,包含优化中的各类设置,不少其余第三方的优化函数也遵循这样的设置方式。常见的设置元素包括最大迭代次数maxit、绝对收敛容忍度abstol、相对收敛容忍度reltol等。详情能够经过?optim来获得。
  • hessian:表示十分返回hessian矩阵,默认为FALSE,可是hessian矩阵对其余的运算仍是很是重要的,好比估计参数的置信区间。

例子

使用CG共轭梯度法在默认的迭代次数下求解:

optim(par = c(0,3),fn=obj)

图片描述

发现算法到达迭代次数上限而退出。

咱们增长迭代次数:

optim(par = c(0,3),fn=obj,method = "CG",control = list(maxit=500))

图片描述

能够发现目标函数的值能够减小,进一步增长迭代的次数能够获得最优解,可是效率上比默认的Nelder-Mead单纯型法差太多。注意:CG已经使用梯度信息,不须要咱们本身传入自定义的gradient函数

若是咱们使用拟牛顿法BFGS,下面分别为不传入梯度信息与本身传入梯度信息

optim(par = c(0,3),fn=obj,method = "BFGS")

图片描述

optim(par = c(0,3),fn=obj,gr=gradient,method = "BFGS")

图片描述

图片描述

相关文章
相关标签/搜索