1. 程式人生 > >最優化讀書筆記R(一)

最優化讀書筆記R(一)

人生是場窮遊,偶爾需要暴走


*# R讀書筆記(一)*


無約束的線性規劃

實質可以轉化為求根問題

1.求單根時:

uniroot(f,interval)

2.求多項式的根

**f(x)=a0+a1*x....+an*x^n**
polyroot(y)
#y=(an,...a1,a0)

3.一般方程

library(rootSolve)
uniroot.all(f, interval, lower = min(interval), upper = max(interval))
# 可以求出指定區間的所有根

4.方程組

multiroot(f, start, ...
) #start 初始值

例:

x1^2+x2^2-4=0
x1^2+x2^2-1=0
library(rootSolve)
f<-function(x){
    x1<-x[1]
    x2<-x[2]
    c(x1^2+x^2-4,x1^2-x2^2+1)
}
multiroot(f,start=c(1,1))
 結果:
 $root
[1] 1.224745 1.581139

$f.root
[1]  4.357128e-10 -4.362963e-10

$iter
[1] 5

$estim.precis
[1] 4.360046e-10

無約束的線性規劃

優化演算法的思路:此類問題一般都難以直接求解,可以通過數值計算的方法來求極值,最常見的演算法就是設計迭代。一般選定某個初始點,沿著某個方向出發,然後確定新的點,再次確定搜尋方向,以此迴圈。如果目標函式的值不斷下降,稱其為下降演算法;如果目標函式的值會收斂,就說明會找到極值。

1.一維搜尋

R中自帶的函式optimize。例如:
f<-function(x,y,z) (x-y+z)^2
optimize(f,c(-1,1),tol=0.0001,y=1,z=1)
# fx軸(-1,1)上極值的搜尋
#tol 代表容忍度,是搜尋停止的標記

注:對於凸函式來說,區域性極小值就是全域性極小值,這樣的情況並不多,通常都是非凸函式,若初始點附近的極值不是全域性極小值,搜尋就會變得很困難。

R中的optim可以通過接納梯度函式來優化求解過程。

關於梯度函式求解可以藉助(Deriv包來實現)。一下以香蕉函式為例,做出說明。

**f(x1,x2)=(1-x1)^2+100*(x2-x1^2)^2**
library(Deriv)
f<-expression((1-x1)^2+100*(x2-x1^2)^2)**
Simplify(D(f,"x1"))
Simplify(D(f,"x2"))
# 構造梯度函式
gr.f<-function(x){
    x1<-x[1]
    x2<-x[2]
    c(-(2 * (1 - x1) + 400 * (x1 * (x2 - x1^2))),200 * (x2 - x1^2))
}
#構造目標函式
gr.f<-function(x){
    x1<-x[1]
    x2<-x[2]
   (1-x1)^2+100*(x2-x1^2)^2
}
optim(par(0,3),obj.f,gr.f)
# optim 求出極值,par為初始值

2.多維搜尋

optim的用法

optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN", "Brent"), lower = ,upper = Inf,
      control = list(), hessian = FALSE)
#par 為初始值,fn為目標函式,gr為梯度函式,method 為優化方法;lower/upper為method為L-BFFG_B的約束;
#control 引數為list(maxit——最大迭代數,abtol/retol);hession 表示是否返回海塞矩陣,預設是FALSE
method方法依次是:
  • 單純型法:沒有用到許多函式特徵(比如梯度)比較穩健,效率也不低,常被當作預設演算法
  • 擬牛頓法(變尺度法)改進的牛頓法容易初始點的影響,又不需每一步精確地計算海塞矩陣及其逆矩陣,
  • L_BFGS_B是對變尺度法的優化
  • SANN是一種模擬退火演算法(概率演算法):可以針對不可微函式,找出最優解
  • Brent是演算法是一種簡單的以為搜尋方法
convergence程式碼的含義:
  • 0:表示成功的執行了上述優化任務
  • 1:表示達到了迭代上限而退出
  • 10:表示退化(單純性無法移動)
  • 51:52:專指L_BFGS_B出現的警告資訊/錯誤資訊