优化问题
在regression中通常要对参数求解,通过计算使得loss function最小,或者MLE估计最大,在有函数形式的问题中,通常采用的是牛顿梯度下降法,或者拟牛顿法(BFGS)。下面我介绍下R中如何利用已有函数来求解参数,以及如何手工计算。
例1. 目标函数为Rosenbrock Banana function:
要求取最小值时的,即一阶导为0的点,也就是一阶导数的根。方法采用牛顿梯度下降法,需要用到一阶导Jacobian矩阵,和二阶导Hessian矩阵。
手工计算:
Jacobian matrix:
Hessian matrix:
x,y 的迭代公式为:(P249, "Machine Learning: A probability perspective")
R code如下:
fr = function(x) { ## Rosenbrock Banana function x1 = x[1] x2 = x[2] 100 * (x2 - x1 * x1)^2 + (1 - x1)^2 } library(numDeriv) x = NULL x0 = c(110,210) x = rbind(x,x0) i = 1 for(i in 2:100){ gk = jacobian(fr,x[i-1,]) hk = hessian(fr,x[i-1,]) dk = -solve(hk) %*% t(gk) xnew = x[i-1,] + t(dk) x = rbind(x,xnew) rownames(x)[i] = paste0("x",i-1) if(abs(sum(x[i,] - x[i-1,])) < 0.00001){ break } }
结果如下:
可以看出,从起始点110, 210,通过迭代,到最后1, 1点收敛,说明极值点为(1,1)
optim() in R:
optim(par=c(3,3),fn=fr,method="BFGS")
结果如下:
optim中par表示待估参数初始值,fn表示目标函数,method为采用的方法,BFGS为较多使用的,拟牛顿法。注意不同的初始值可能收敛于不同点。
例2. logistics regression
负的MLE函数为:
其中
因此我们可以写出目标函数的代码,并且利用optim进行参数优化:
手工计算:
f1 = function(data,w){ p = 1/(1+exp(-w[1] - w[2]* data$gre - w[3]*data$gpa - w[4]*data$rank)) mle = -sum(data$admit * log(p) + (1-data$admit )* log(1-p)) mle } f2 = function(data,w){ x = data[,1:3] y = data[,4] w = as.matrix(w) p = 1/(1+exp(-x%*%w)) mle = -sum(y * log(p) + (1-y)* log(1-p)) mle } mydata <- read.csv("http://pingax.com/wp-content/uploads/2013/12/data.csv") m <- as.matrix(mydata) m <- cbind(rep(1,nrow(m)),m) optim(par=c(0,0,0),fn=f2,data=m,method="BFGS")
结果如下:
我们用glm logistics regression 来检验:
可以看出结果非常接近。
例2的数据在哪可以获得呢