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")

圖片描述

圖片描述

相關文章
相關標籤/搜索