我已经读过可以通过简单地将数据行添加到原始数据矩阵中来实现岭回归,其中每行使用0表示因变量,而平方根或使用0表示自变量。然后为每个自变量添加额外的一行。
我想知道是否有可能针对所有情况(包括逻辑回归或其他GLM)得出证明。
我已经读过可以通过简单地将数据行添加到原始数据矩阵中来实现岭回归,其中每行使用0表示因变量,而平方根或使用0表示自变量。然后为每个自变量添加额外的一行。
我想知道是否有可能针对所有情况(包括逻辑回归或其他GLM)得出证明。
Answers:
Ridge回归将 。
(通常需要一个常数,但不要缩小。在那种情况下,它包含在和预测变量中-但是,如果您不想收缩它,则没有对应的行用于伪观察。或者如果您确实想缩小它,那么您确实有一行。我将它写为好像它没有被计入,也不收缩,因为这是更复杂的情况。另一种情况是对此进行的微不足道的更改)
如果我们可以将每个“ y”和每个对应的向量“ x”写成,则可以将第二项写为伪观测 。
但是通过检查,只需让,让然后让所有其他(包括)。
然后
。
这适用于线性回归。它不适用于逻辑回归,因为普通逻辑回归无法最小化残差平方和。
[脊退并不是通过这种伪观察技巧可以完成的唯一事情-它们在许多其他情况下也可以出现]
将这个配方推广到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
不起作用]