最優化讀書筆記R(一)
阿新 • • 發佈:2019-01-02
人生是場窮遊,偶爾需要暴走
*# 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)
# f的x軸(-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出現的警告資訊/錯誤資訊