リッジ回帰は、元のデータ行列にデータの行を追加するだけで達成できることを読みました。各行は、従属変数に0 、独立変数に平方根またはゼロを使用して構築されます。次に、独立変数ごとに1行追加されます。
ロジスティック回帰や他のGLMを含め、すべての場合に証拠を導き出すことが可能かどうか疑問に思っていました。
リッジ回帰は、元のデータ行列にデータの行を追加するだけで達成できることを読みました。各行は、従属変数に0 、独立変数に平方根またはゼロを使用して構築されます。次に、独立変数ごとに1行追加されます。
ロジスティック回帰や他のGLMを含め、すべての場合に証拠を導き出すことが可能かどうか疑問に思っていました。
回答:
リッジ回帰は、最小化 。
(多くの場合、定数が必要ですが、縮小されません。その場合、と予測子に含まれますが、縮小したくない場合は、擬似観測に対応する行がありません。あなたはそれを縮小したい、あなたはそれのための行を持っている。私はそれがpで数えられないようにそれを書いて、それはより複雑なケースであるので、縮まない。 )
各 "y"と対応する(p + 1 ) -vectors "x"を次のように書くことができれば、2番目の項を疑似観測 として書くことができます。
通常)とします。
それから
.
This works for linear regression. It doesn't work for logistic regression, because ordinary logistic regression doesn't minimize a sum of squared residuals.
[Ridge regression isn't the only thing that can be done via such pseudo-observation tricks -- they come up in a number of other contexts]
Generalizing this recipe to GLMs indeed is not difficult as GLMs are usually fit using iteratively reweighted least squares. Hence, within each iteration one can subsitute the regular weighted least squares step with a ridge penalized weighted least squares step to get a ridge penalized GLM. In fact, in combination with adaptive ridge penalties this recipe is used to fit L0 penalized GLMs (aka best subset, ie GLMs where the total number of nonzero coefficients are penalized). This has been implemented for example in the l0ara package, see this paper and this one for details.
It's also worth noting that the fastest closed-form way of solving a regular ridge regression is using
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
動作しません]