操作optim最优化函数举办曲线拟合
R语言中对函数求极值有两种呼吁,较简朴的是optimize函数,在确定搜索范畴后可对一元函数求极值,譬喻:
f = function(x) 3*x^4 − 2*x^3 + 3*x^2 − 4*x + 5在对多元函数求极值时,则需操作到更强大的optim函数,本例来自于《Introduction to Scientific Programming and Simulation Using R》,个中数据可从spuRs包中得到。本例的方针是对树木体积举办建模,自变量为树龄,函数形式为指数形式,个中包罗了三个待定参数。
optimize(f, lower=-20, upper=20)
$minimum
[1] 0.5972778
$objective
[1] 3.636756
首先成立模子函数
richards = function(t, theta){
theta[1]*(1 – exp(-theta[2]*t))^theta[3]}
再操作最小二乘成立误差函数
loss = function(theta, age, vol){
sum((vol – richards(age, theta))^2)}
读入数据
trees = read.table(‘clipboard’,T)
tree = trees[trees$ID==”1.3.11″, 2:3]
确定搜寻参数起始点
theta0 <- c(1000, 0.1, 3)
求使误差最小化的参数值,optim呼吁中第一项为起始点,第二项为方针函数,后头的是所需数据变量,optim呼吁的默认要领是Nelder-Mead算法,它是求多维函数极值的一种算法,由Nelder和Mead提出,又叫纯真形算法,但和线性筹划中的纯真形算法是差异的,由于未操作任何求导运算,算法较量简朴,但收敛速度较慢,适合变量数不是许多的方程求极值
theta.L <- optim(theta0, loss, age=tree$Age, vol=tree$Vol)
绘制拟合图形
plot(tree$Age, tree$Vol, xlab=”Age”, ylab=”Volume”, main=’Tree 1.3.11′)
lines(tree$Age, richards(tree$Age, theta.L$par), col=”blue”)
调查拟合功效,若convergence取0则表白收敛乐成,可以看到本例的最小误差为2773,而par则是三个较佳参数。
theta.L2
$convergence
[1] 0
$par
[1] 3.596401e+03 1.541453e-02 2.779727e+00
$value
[1] 2773.842