Negatif olmayan sırt regresyonu nasıl yapılır?


10

Negatif olmayan sırt regresyonu nasıl yapılır? Negatif olmayan kement mevcuttur scikit-learn, ancak sırt için betaların olumsuzluklarını zorlayamam ve gerçekten de negatif katsayılar alıyorum. Bunun neden olduğunu bilen var mı?

Ayrıca, en küçük kareler açısından sırt uygulayabilir miyim? Bunu başka bir soruya taşıdık: OLS regresyonu açısından sırt regresyonunu uygulayabilir miyim?


1
Burada oldukça dik iki soru var, ayrı bir soru olarak "en küçük kareler açısından sırt uygulayabilir miyim?"
Matthew Drury

Yanıtlar:


8

"Bunun neden olduğunu bilen var mı? " Sorusunun iklim karşıtı yanıtı , hiç kimsenin negatif olmayan bir sırt regresyon rutini uygulamak için yeterince umurunda olmamasıdır. Ana nedenlerden biri, insanların zaten negatif olmayan elastik ağ rutinlerini uygulamaya başlamış olmasıdır (örneğin burada ve burada ). Elastik ağ özel bir durum olarak sırt regresyonunu içerir (biri esas olarak LASSO parçasını sıfır ağırlıkta olacak şekilde ayarlar). Bu çalışmalar nispeten yenidir, bu nedenle henüz scikit-learn veya benzeri bir genel kullanım paketine dahil edilmemiştir. Kod için bu makalelerin yazarlarına danışmak isteyebilirsiniz.

DÜZENLE:

@ Amoeba ve ben yorumlarda tartıştığımız gibi, bunun gerçek uygulaması nispeten basittir. Diyelim ki şu regresyon problemi var:

y=2x1x2+ϵ,ϵN(0,0.22)

burada ve her ikisi de standart normallerdir: . Dikkat Daha sonra normalleştirmek zorunda değilim standartlaştırılmış tahmin değişkenleri kullanın. Basitlik için bir kesişim de eklemem. Bu regresyon problemini standart lineer regresyon kullanarak derhal çözebiliriz. Yani R'de şöyle bir şey olmalı:x1x2xpN(0,1)

rm(list = ls()); 
library(MASS); 
set.seed(123);
N = 1e6;
x1 = rnorm(N)
x2 = rnorm(N)
y = 2 * x1 - 1 * x2 + rnorm(N,sd = 0.2)

simpleLR = lm(y ~ -1 + x1 + x2 )
matrixX = model.matrix(simpleLR); # This is close to standardised
vectorY = y
all.equal(coef(simpleLR), qr.solve(matrixX, vectorY), tolerance = 1e-7)  # TRUE

Son satıra dikkat edin. Hemen hemen tüm doğrusal regresyon rutini değerini tahmin etmek için QR ayrışmasını kullanır . Aynısını sırt regresyon problemimiz için de kullanmak istiyoruz. Bu noktada @whuber tarafından gönderilen bu yazıyı okuyun ; tam olarak bu prosedürü uygulayacağız . Kısacası, orijinal tasarım artırmada olacak matris bir diyagonal matris ve yanıt vektörü ile sıfır. Bu şekilde orijinal sırt regresyon problemini olarak buradaβXλbenpyp(XTX+λben)-1XTy(X¯TX¯)-1X¯Ty¯¯artırılmış versiyonu sembolize eder. Tamlık için bu notlardan 18-19 slaytlarını da kontrol edin , onları oldukça basit buldum. Yani R'de bazıları aşağıdakileri isteriz:

myLambda = 100;  
simpleRR = lm.ridge(y ~ -1 + x1 + x2, lambda = myLambda)
newVecY = c(vectorY, rep(0, 2))
newMatX = rbind(matrixX, sqrt(myLambda) * diag(2))
all.equal(coef(simpleRR), qr.solve(newMatX, newVecY), tolerance = 1e-7)  # TRUE

ve çalışıyor. Tamam, sırtın regresyon kısmını aldık. Yine de başka bir şekilde çözebiliriz, bunu karelerin kalan toplamının maliyet fonksiyonu olduğu bir optimizasyon problemi olarak formüle edebiliriz ve sonra buna karşı optimize edebiliriz, yani. . Tabii ki bunu yapabiliriz:minβ||y¯-X¯β||22

myRSS <- function(X,y,b){ return( sum( (y - X%*%b)^2 ) ) }
bfgsOptim = optim(myRSS, par = c(1,1), X = newMatX, y= newVecY, 
                  method = 'L-BFGS-B')
all.equal(coef(simpleRR), bfgsOptim$par, check.attributes = FALSE, 
          tolerance = 1e-7) # TRUE

yine beklendiği gibi çalışıyor. Şimdi şunu istiyoruz: burada . Bu sadece aynı optimizasyon problemidir ancak çözümün negatif olmaması için kısıtlanmıştır.minβ||y¯-X¯β||22β0

bfgsOptimConst = optim(myRSS, par = c(1,1), X=newMatX, y= newVecY, 
                       method = 'L-BFGS-B', lower = c(0,0))
all(bfgsOptimConst$par >=0)  # TRUE
(bfgsOptimConst$par) # 2.000504 0.000000

Orijinal negatif olmayan sırt regresyon görevinin basit bir kısıtlanmış optimizasyon problemi olarak yeniden formüle edilerek çözülebileceğini gösterir. Bazı uyarılar:

  1. (Pratik olarak) normalleştirilmiş tahmin değişkenlerini kullandım. Normalleşmeyi kendiniz hesaplamanız gerekecektir.
  2. Aynı şey için de geçerli olmayan kesişim normalleşmesi.
  3. Kullandığım optim'nin L-BFGS-B değişken. Sınırları kabul eden en vanilya R çözücüsüdür. Eminim düzinelerce daha iyi çözücü bulacaksınız.
  4. Genel olarak, doğrusal en küçük kareler problemleri ikinci dereceden optimizasyon görevleri olarak ortaya konmaktadır . Bu, bu gönderi için bir overkill olduğunu, ancak gerekirse daha iyi hız alabileceğinizi unutmayın.
  5. Yorumlarda belirtildiği gibi, sırt-regresyonunu artırılmış doğrusal-regresyon parçası olarak atlayabilir ve sırt maliyet fonksiyonunu doğrudan bir optimizasyon problemi olarak kodlayabilirsiniz. Bu çok daha basit olurdu ve bu yazı önemli ölçüde daha küçük. Tartışma uğruna bu ikinci çözümü de ekliyorum.
  6. Python'da tamamen konuşmuyorum, ancak aslında bu işi NumPy'nin linalg.solve ve SciPy'nin optimize işlevlerini kullanarak çoğaltabilirsiniz .
  7. Hiperparametre vs.'yi seçmek için , her durumda yapacağınız normal CV adımını yapmanız yeterlidir; hiçbirşey değişmez.λ

5. nokta için kod:

myRidgeRSS <- function(X,y,b, lambda){ 
                return( sum( (y - X%*%b)^2 ) + lambda * sum(b^2) ) 
              }
bfgsOptimConst2 = optim(myRidgeRSS, par = c(1,1), X = matrixX, y = vectorY,
                        method = 'L-BFGS-B', lower = c(0,0), lambda = myLambda)
all(bfgsOptimConst2$par >0) # TRUE
(bfgsOptimConst2$par) # 2.000504 0.000000

1
Bu biraz yanıltıcı. Negatif olmayan sırt regresyonunun uygulanması önemsizdir: biri, genişletilmiş veriler üzerinde her zamanki regresyon olarak sırt regresyonunu yeniden yazabilir (bkz. Stats.stackexchange.com/questions/203687 yorumları ) ve ardından negatif olmayan regresyon rutinlerini kullanabilirsiniz.
amip

Uygulamanın basit olduğunu kabul ediyorum (+1). (Daha önce seninkini ve Glen'in diğer konu hakkındaki yorumunu da kaldırdım). Soru, zor olmasa da neden uygulanmadığıdır. Bu konuda, bu NNRR görevini doğrudan formüle etmenin bir optimizasyon probleminin önce genişleyen bir veri gerilemesi olarak formüle etmesinin ve ardından Quad'in kullanılmasından daha basit olduğundan şüpheleniyorum. Prog. Bu regresyonu çözmek için optimizasyon. Cevabımda bunu söylemedim çünkü uygulama kısmında girişim olacaktı.
usεr11852

Ya da sadece stan.
Sycorax, Reinstate Monica'ya

Ah tamam; Q'yu esas olarak negatif olmayan sırtın nasıl yapılacağını sordum (ve sadece neden geçerken uygulanmadığını soruyorum); Bunu başlığa koymak için bile düzenledim. Her durumda, nasıl yapılacağı bana daha ilginç bir soru gibi geliyor. Cevabınızı negatif olmayan sırtın nasıl uygulanacağıyla ilgili açıklamalarla güncelleyebiliyorsanız, gelecekteki okuyucular için çok yararlı olacağını düşünüyorum (ve oylamayı memnuniyetle yapacağım :).
amip

1
Güzel, daha sonra yapacağım (yeni başlığı fark etmedim, bunun için üzgünüm). Muhtemelen OLS / sözde gözlemler açısından uygulamayı vereceğim, bu yüzden diğer soruya da cevap vereceğiz.
usεr11852

4

Elastik ağ ve dolayısıyla kement ve sırt uygulayan R paket glmnet buna izin verir. Parametreler ile lower.limitsve upper.limits, sen 0 alt sınırları ayarlamak bu yüzden, bu negatif olmayan elastik bir ağ (kement / sırt) gerçekleştirdiği bir minimum ya da ayrı ayrı her ağırlık için bir maksimum değer ayarlayabilirsiniz.

Ayrıca bir python sarıcısı da https://pypi.python.org/pypi/glmnet/2.0.0


2

Çözmeye çalıştığımızı hatırlayın:

küçültmekxbirx-y22+λx22st x>0

şuna eşittir:

küçültmekxbirx-y22+λxbenxst x>0

biraz daha cebir ile:

küçültmekxxT(birTbir+λben)x+(-2birTy)Txst x>0

Sözde-python çözümü basitçe yapmaktır:

Q = A'A + lambda*I
c = - A'y
x,_ = scipy.optimize.nnls(Q,c)

bkz: formundaki düzenleyicileri kullanılarak seyrek negatif olmayan en küçük kareler nasıl ?KxR,kx

biraz daha genel bir cevap için.


C = - A'y c = A'y okumaz mı? Bu doğru olduğunu düşünüyorum, ancak bir çözüm scipy.optimize.nnls (newMatX, newVecY) 'den biraz farklı olduğunu unutmayın, burada newMatX, diyagonal boyunca sqrt (lambda) ile çapraz bir matris ile güçlendirilmiş X satır ve NewVecY Y'dir nvar sıfırlarla artırıldı.
Bahsettiğiniz çözümün
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.