如何用最优化函数编码R中的正则化(惩罚)多元逻辑回归
我用手写梯度函数在R中编码了一个正则化(惩罚)多元逻辑回归。 它工作正常,但问题是它太慢了。有没有办法通过使用优化函数来提高速度 我看过这段代码,但它没有使用优化函数。 有人建议我使用带有“BFGS”方法的optim函数。但我不知道如何创建代价函数(J)和系数方向(gra)-尤其是系数方向的部分 谢谢如何用最优化函数编码R中的正则化(惩罚)多元逻辑回归,r,optimization,regression,regularized,R,Optimization,Regression,Regularized,我用手写梯度函数在R中编码了一个正则化(惩罚)多元逻辑回归。 它工作正常,但问题是它太慢了。有没有办法通过使用优化函数来提高速度 我看过这段代码,但它没有使用优化函数。 有人建议我使用带有“BFGS”方法的optim函数。但我不知道如何创建代价函数(J)和系数方向(gra)-尤其是系数方向的部分 谢谢 > ################################################# > # prepare dataset to solve logistic r
> #################################################
> # prepare dataset to solve logistic regression
> vY <- c(1,1,1,1,1,0,0,0,0,0)
> vX1 <- c(1,3,5,2,7,6,9,7,8,9)
> vX2 <- c(1,0,0,0,0,0,0,2,1,1)
> mydata <- data.frame(y=vY,u=vX1,v=vX2)
>
> #################################################
> # solve by hand written gradient
> vHiFeatures <- 1 #6
> la <- 0
> alpha <- 0.3
>
> # plot the data
> plot(mydata$u[mydata$y == 0], mydata$v[mydata$y == 0], xlab="u", ylab="v")
> points(mydata$u[mydata$y == 1], mydata$v[mydata$y == 1], col="blue", pch=3)
> legend("topright", c("y=0","y=1"), pch=c(1, 3), col=c("black", "blue"), bty="n")
>
> # build high order feature vector
> hi.features = function (f1,f2,deg) {
+ n = ncol(f1)
+ ma = matrix(rep(1,length(f1)))
+ for (i in 1:deg) {
+ for (j in 0:i)
+ ma = cbind(ma, f1^(i-j) * f2^j)
+ }
+ return(ma)
+ }
> # sigmoid function
> g <- function (z) {
+ return (1 / (1 + exp(-z) ))
+ } # plot(g(c(1,2,3,4,5,6)), type="l")
> h <- function (x,th) {
+ return(g(x %*% th))
+ }
> # cost function
> J <- function (x,y,th,m,la) {
+ pt = th
+ pt[1] = 0
+ A = (la/(2*m))* t(pt) %*% pt
+ return( -1/m * sum(y * log(h(x,th)) + (1 - y) * log(1 - h(x,th))) + A)
+ }
> # gradient
> grad <- function (x,y,th,m,la=1,al=1) {
+ G = (la/m * th)
+ G[1,] = 0
+ th <- th - al* ((1/m * t(x) %*% (h(x,th) - y)) + G)
+ th
+ }
>
> m = length(mydata$u) # samples
> x = hi.features(mydata$u, mydata$v, vHiFeatures)
> n = ncol(x) # features
> y = matrix(mydata$y, ncol=1)
>
> # use the cost function to check is works
> th1 <- matrix(0,n)
> jiter = array(0,c(100000,1))
> for (i in 1:100000) {
+ jiter[i] = J(x,y,th1,m,la)
+ # th1 = th1 - solve(H(x,y,th1,m,la)) %*% grad(x,y,th1,m,la)
+ th1 <- grad(x,y,th1,m,la,alpha)
+ }
> # check that is converging correctly
> plot(jiter, xlab="iterations", ylab="cost J", type="l")
> th1
[,1]
[1,] 7.447780
[2,] -1.116073
[3,] -2.708777
>
> #################################################
> # solve by glm function
> dTemp <- data.frame(y=y,x)
> # oModel <- glm(as.factor(y)~., dTemp, family=binomial(link=logit))
> oModel <- glm(as.factor(y)~., dTemp[,-2], family="binomial")
> oModel
Call: glm(formula = as.factor(y) ~ ., family = "binomial", data = dTemp[,
-2])
Coefficients:
(Intercept) X2 X3
7.448 -1.116 -2.709
Degrees of Freedom: 9 Total (i.e. Null); 7 Residual
Null Deviance: 13.86
Residual Deviance: 4.633 AIC: 10.63
>#################################################
>#准备数据集以解决逻辑回归问题
>vY vX1 vX2 mydata
> #################################################
>#手写梯度求解
>阿尔法酒店
>#绘制数据
>绘图(mydata$u[mydata$y==0],mydata$v[mydata$y==0],xlab=“u”,ylab=“v”)
>点数(mydata$u[mydata$y==1],mydata$v[mydata$y==1],col=“blue”,pch=3)
>图例(“右上角”、c(“y=0”、“y=1”)、pch=c(1,3)、col=c(“黑色”、“蓝色”)、bty=“n”)
>
>#构建高阶特征向量
>高特性=功能(f1、f2、deg){
+n=ncol(f1)
+ma=矩阵(代表(1,长度(f1)))
+用于(1:deg中的i){
+对于(0:i中的j)
+ma=cbind(ma,f1^(i-j)*f2^j)
+ }
+返回(ma)
+ }
>#S形函数
>g h#成本函数
>J#梯度
>梯度m=长度(mydata$u)#样本
>x=高级功能(mydata$u、mydata$v、vHiFeatures)
>n=ncol(x)#特征
>y=矩阵(mydata$y,ncol=1)
>
>#使用成本函数检查is工作
>th1 jiter=阵列(0,c(100000,1))
>对于(1:100000中的i){
+jiter[i]=J(x,y,th1,m,la)
+#th1=th1-求解(H(x,y,th1,m,la))%*%grad(x,y,th1,m,la)
+th1#检查是否正确会聚
>绘图(jiter,xlab=“迭代”,ylab=“成本J”,type=“l”)
>th1
[,1]
[1,] 7.447780
[2,] -1.116073
[3,] -2.708777
>
> #################################################
>#用glm函数求解
>dTemp#oModel oModel
调用:glm(公式=as.factor(y)~,family=“二项式”,data=dTemp[,,
-2])
系数:
(截距)X2 X3
7.448 -1.116 -2.709
自由度:共9个(即零);剩余7个
零偏差:13.86
剩余偏差:4.633 AIC:10.63