函数优化
R语言中对函数求极值有两种命令,较简单的是optimize函数,在确定搜索范围后可对一元函数求极值,例如:
f = function(x) {3*x^4-2*x^3+3*x^2-4*x+5}
optimize(f, lower=-20, upper=20)
#optimize(f,c(-20,20),maximum=F)
其中$minimum为自变量x的取值,$objective为函数值
#似然函数
f <- function(p) {
p^7*(1-p)^3
}
#对数似然函数
ll <-function(p) {
7*log(p)+3*log(1-p)
}
optimize(f, lower=0, upper=1,maximum = T)
optimize(ll, lower=0, upper=1,maximum = T)
optim函数中第一项为起始点,第二项为目标函数,后面的是所需数据变量,optim命令的默认方法是Nelder-Mead算法,它是求多维函数极值的一种算法,由Nelder和Mead提出,又叫单纯形算法,但和线性规划中的单纯形算法是不同的,由于未利用任何求导运算,算法比较简单,但收敛速度较慢,适合变量数不是很多的方程求极值
normal <- function(theta,x){
mu <- theta[1]
sigma2 <- theta[2]
n <- length(x)
logL <- -0.5*n*log(2*pi)-0.5*n*log(sigma2)-(1/(2*sigma2))*sum((x-mu)**2)
return (-logL)
}
x <- rnorm(1000)
optim(c(0,1),normal,x=x)
optim(c(0,1),normal,x=x,method="BFGS")
f = function(x) {3*x^4-2*x^3+3*x^2-4*x+5}
optimize(f, lower=-20, upper=20)
#optimize(f,c(-20,20),maximum=F)
其中$minimum为自变量x的取值,$objective为函数值
#似然函数
f <- function(p) {
p^7*(1-p)^3
}
#对数似然函数
ll <-function(p) {
7*log(p)+3*log(1-p)
}
optimize(f, lower=0, upper=1,maximum = T)
optimize(ll, lower=0, upper=1,maximum = T)
optim函数中第一项为起始点,第二项为目标函数,后面的是所需数据变量,optim命令的默认方法是Nelder-Mead算法,它是求多维函数极值的一种算法,由Nelder和Mead提出,又叫单纯形算法,但和线性规划中的单纯形算法是不同的,由于未利用任何求导运算,算法比较简单,但收敛速度较慢,适合变量数不是很多的方程求极值
normal <- function(theta,x){
mu <- theta[1]
sigma2 <- theta[2]
n <- length(x)
logL <- -0.5*n*log(2*pi)-0.5*n*log(sigma2)-(1/(2*sigma2))*sum((x-mu)**2)
return (-logL)
}
x <- rnorm(1000)
optim(c(0,1),normal,x=x)
optim(c(0,1),normal,x=x,method="BFGS")
评论
发表评论