使用行增强的 Ridge 惩罚 GLM?

机器算法验证 物流 广义线性模型 岭回归
2022-03-15 04:14:36

的平方根或零作为自变量来构造的。然后为每个自变量添加一个额外的行。k

我想知道是否有可能为所有案例得出一个证明,包括逻辑回归或其他 GLM。

2个回答

岭回归最小化 i=1n(yixiTβ)2+λj=1pβj2

(通常需要一个常数,但不会缩小。在这种情况下,它包含在和预测变量中——但如果你不想缩小它,你就没有对应的伪观察行。或者如果你确实想缩小它,你确实有一行。我会把它写成不计入,而不是缩小,因为它是更复杂的情况。另一种情况是一个微不足道的变化.)βp

-向量“x”,我们可以将第二项写为伪观察 p(p+1)

(yn+jxn+jTβ)2=λβj2,j=1,,p

但是通过检查,只需让,让并让所有其他(包括通常)。yn+j=0xn+j,j=λxn+j,k=0xn+j,0=0

然后

(yn+j[xn+j,0β0+xn+j,1β1+xn+j,2β2+...+xn+j,pβp])2=λβj2

这适用于线性回归。它不适用于逻辑回归,因为普通逻辑回归不会最小化残差平方和。

[岭回归不是唯一可以通过这种伪观察技巧完成的事情——它们出现在许多其他情况下]

将这个方法推广到 GLM 确实并不困难,因为 GLM 通常使用迭代重新加权最小二乘来拟合。因此,在每次迭代中,可以用脊惩罚加权最小二乘步代替常规加权最小二乘步,以获得脊惩罚 GLM。事实上,结合自适应岭惩罚,这个配方用于拟合 L0 惩罚 GLM(也称为最佳子集,即非零系数总数受到惩罚的 GLM)。例如,这已在l0ara 包中实现,有关详细信息,请参阅这篇论文这篇论文。

还值得注意的是,解决常规岭回归的最快封闭式方法是使用

lmridge_solve = function (X, y, lambda, intercept = TRUE) {
  if (intercept) {
    lambdas = c(0, rep(lambda, ncol(X)))
    X = cbind(1, X)
  } else { lambdas = rep(lambda, ncol(X)) }
  solve(crossprod(X) + diag(lambdas), crossprod(X, y))[, 1]
}

对于n>=p, 或使用的情况

lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]

何时p>n以及对于没有截距的模型。

这比使用行扩充配方快,即做

lmridge_rbind = function (X, y, lambda, intercept = TRUE) {
  if (intercept) {
    lambdas = c(0, rep(lambda, ncol(X)))
    X = cbind(1, X)
  } else { lambdas = rep(lambda, ncol(X)) }
  qr.solve(rbind(X, diag(sqrt(lambdas))), c(y, rep(0, ncol(X))))
}

如果您碰巧需要对拟合系数进行非负性约束,那么您可以这样做

library(nnls)

nnlmridge_solve = function (X, y, lambda, intercept = TRUE) {
  if (intercept) {
    lambdas = c(0, rep(lambda, ncol(X)))
    X = cbind(1, X)
  } else { lambdas = rep(lambda, ncol(X)) }
  nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
}

顺便说一句,它给出的结果比

nnlmridge_rbind = function (X, y, lambda, intercept = TRUE) {
  if (intercept) {
    lambdas = c(0, rep(lambda, ncol(X)))
    X = cbind(1, X)
  } else { lambdas = rep(lambda, ncol(X)) }
  nnls(A=rbind(X,diag(sqrt(lambdas))), b=c(Y,rep(0,ncol(X))))$x 
}

(严格来说,只有解决方案nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x 才是正确的)。

我还没有弄清楚如何针对该案例进一步优化非负约束案例p > n- 让我知道是否有人会碰巧知道如何做到这一点...... [lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x不起作用]