Generalizing สูตรนี้เพื่อ GLMs แน่นอนไม่ได้เป็นเรื่องยากที่ GLMs มักจะพอดีกับการใช้reweighted ซ้ำสองน้อยที่สุด ดังนั้นในการทำซ้ำแต่ละครั้งเราสามารถทำการลดขั้นตอนกำลังสองน้อยที่สุดตามปกติด้วยสันเขาลงโทษขั้นต่ำกำลังสองขั้นต่ำเพื่อรับการลงโทษ GLM ในความเป็นจริงเมื่อใช้ร่วมกับบทลงโทษปรับสันเขาสูตรนี้จะใช้เพื่อให้พอดีกับ L0 GLMs ลงโทษ (aka ส่วนย่อยที่ดีที่สุดคือ GLMs ที่จำนวนรวมของค่าสัมประสิทธิ์ที่ไม่ใช่ศูนย์จะถูกลงโทษ) สิ่งนี้ได้ถูกนำไปใช้เช่นในแพ็คเกจ 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
นั้นเป็นหนึ่งที่ถูกต้อง)
ฉันยังไม่ทราบว่ากรณีที่มีข้อ จำกัด แบบ nonnegativity สามารถปรับให้เหมาะสมสำหรับp > n
กรณีได้อย่างไร - แจ้งให้เราทราบหากใครจะรู้วิธีการทำเช่นนี้ ... [ lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
ไม่ทำงาน]