Việc khái quát hóa công thức này cho GLM thực sự không khó vì GLM thường phù hợp bằng cách sử dụng các bình phương tối thiểu lặp lại . Do đó, trong mỗi lần lặp, người ta có thể thực hiện bước bình phương tối thiểu có trọng số thông thường với một bước vuông bình phương có trọng số nhỏ nhất để có được một sườn núi bị phạt GLM. Trong thực tế, kết hợp với hình phạt sườn thích ứng, công thức này được sử dụng để phù hợp với GLM bị phạt L0 (hay còn gọi là tập hợp con tốt nhất, tức là GLM trong đó tổng số hệ số khác không bị phạt). Điều này đã được thực hiện ví dụ trong gói l0ara , xem bài viết này và bài này để biết chi tiết.
Cũng đáng lưu ý rằng cách thức nhanh nhất để giải quyết hồi quy sườn thông thường là sử dụng
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]
}
cho trường hợp n>=p
, hoặc sử dụng
lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]
khi p>n
và cho một mô hình mà không bị chặn.
Điều này nhanh hơn so với việc sử dụng công thức tăng cường hàng , tức là làm
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))))
}
Nếu bạn có thể cần các ràng buộc không âm trên các hệ số được trang bị thì bạn có thể làm
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
}
mà sau đó cho kết quả btw chính xác hơn một chút so với
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
}
(và nói đúng ra chỉ có giải pháp nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
thì mới đúng).
Tôi vẫn chưa tìm ra làm thế nào trường hợp bị hạn chế không âm thanh có thể được tối ưu hóa hơn nữa cho p > n
vụ án - hãy cho tôi biết nếu có ai đó sẽ biết cách làm điều này ... [ lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
không hoạt động]