Bu tarifi GLM'lere genellemek zor değildir çünkü GLM'ler genellikle tekrarlı olarak yeniden ağırlıklandırılmış en küçük kareler kullanılarak sığar . Bu nedenle, her bir yinelemede, bir sırt cezalandırılan GLM elde etmek için bir sırt cezalandırılan ağırlıklı en küçük kareler adımı ile düzenli ağırlıklı en küçük kareler adımı azaltılabilir. Aslında, uyarlanabilir sırt cezalarıyla birlikte bu tarif L0 cezalandırılmış GLM'lerine (en iyi alt küme, yani toplam sıfır olmayan katsayı sayısının cezalandırıldığı GLM'ler) sığdırmak için kullanılır. Bu, örneğin l0ara paketinde uygulanmıştır , ayrıntılar için bu belgeye ve buna bakın.
Ayrıca düzenli bir sırt regresyonunu çözmenin en hızlı kapalı form yolunun kullandığını da belirtmek gerekir.
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]
}
nerede n>=p
veya kullanıldığında
lmridge_solve_largep = function (X, Y, lambda) (t(X) %*% solve(tcrossprod(X)+lambda*diag(nrow(X)), Y))[,1]
p>n
kesişme olmadan bir model için ne zaman ve ne için.
Bu, satır büyütme tarifini kullanmaktan daha hızlıdır , yani
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))))
}
Takılı katsayılarınızda olumsuzluk kısıtlamalarına ihtiyaç duyarsanız,
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
}
bu da btw'den biraz daha doğru sonuç verir.
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
}
(ve kesinlikle çözüm nnls(A=crossprod(X)+diag(lambdas), b=crossprod(X,Y))$x
o zaman doğru çözümdür ).
Olumsuzluk sınırlaması olan davanın dava için nasıl daha da optimize edilebileceğini henüz p > n
anlamadım - bunun nasıl yapılacağını bilen biri olursa bana bildirin ... [ lmridge_nnls_largep = function (X, Y, lambda) t(X) %*% nnls(A=tcrossprod(X)+lambda*diag(nrow(X)), b=Y)$x
işe yaramaz]