R 使用 GLM 和手动求解逻辑回归具有不同(接近但不完全相同)的结果

机器算法验证 物流 广义线性模型 优化
2022-04-12 20:28:54

我从 R GLM 和手动求解逻辑回归优化中得到不同的结果(接近但不完全相同)。谁能告诉我问题出在哪里?

BFGS 不收敛?有限精度的数值问题?

谢谢

# logistic regression without intercept
fit=glm(factor(vs) ~ hp+wt-1, mtcars, family=binomial())

# manually write logistic loss and use BFGS to solve
x=as.matrix(mtcars[,c(4,6)])
y=ifelse(mtcars$vs==1,1,-1)

lossLogistic <- function(w){
  L=log(1+exp(-y*(x %*% w)))
  return(sum(L))
}

opt=optim(c(1,1),lossLogistic, method="BFGS")

在此处输入图像描述

1个回答

简短的回答:更努力地优化。

你的损失函数很好,没有数字问题。例如,您可以轻松检查:

all.equal( lossLogistic(coef(fit)), as.numeric(-logLik(fit)), 
           check.attributes = FALSE)
[1] TRUE

发生的情况是,您假设optimBFGS 实现可以与使用实际梯度信息的例程一样好 - 请记住,Fisher 评分本质上是Newton-Raphson 例程BFGS 收敛(opt$convergence等于0),但最好的 BFGS 并不是你能得到的最好的,因为由于你没有提供梯度函数,所以例程必须在数值上近似梯度。如果您使用更好的优化程序,可以使用更多类似梯度的信息,您将获得相同的结果。在这里,因为对数似然实际上是一个表现非常好的函数,我什至可以使用二次近似过程来“伪造”梯度信息。

library(minqa)
optQ= minqa::uobyqa(c(1,1),lossLogistic)
all.equal( optQ$par, coef(fit), check.attributes = FALSE)
[1] TRUE
all.equal( optQ$fval, as.numeric(-logLik(fit)), 
           check.attributes = FALSE)
[1] TRUE

有用。