" किसी को भी पता है कि यह क्यों है? " के बजाय विरोधी जलवायु उत्तर है कि बस किसी को भी गैर-नकारात्मक रिज प्रतिगमन दिनचर्या को लागू करने के लिए पर्याप्त परवाह नहीं है। मुख्य कारणों में से एक यह है कि लोगों ने पहले से ही गैर-नकारात्मक लोचदार शुद्ध दिनचर्या (उदाहरण के लिए यहां और यहां ) लागू करना शुरू कर दिया है
। लोचदार जाल में एक विशेष मामले के रूप में रिज रिग्रेशन शामिल है (एक अनिवार्य रूप से एक शून्य भार करने के लिए LASSO भाग सेट करें)। ये कार्य अपेक्षाकृत नए हैं इसलिए इन्हें अभी तक स्किटिट-लर्न या समान सामान्य उपयोग पैकेज में शामिल नहीं किया गया है। आप कोड के लिए इन कागजात के लेखकों से पूछताछ कर सकते हैं।
संपादित करें:
जैसा कि @amoeba और मैंने टिप्पणियों पर चर्चा की कि इसका वास्तविक कार्यान्वयन सापेक्ष सरल है। कहो कि एक को निम्नलिखित प्रतिगमन समस्या है:
y=2x1−x2+ϵ,ϵ∼N(0,0.22)
जहाँ और दोनों मानक हैं जैसे: । सूचना मैं मानकीकृत भविष्यवक्ता चर का उपयोग करता हूं ताकि मुझे बाद में सामान्य करने की आवश्यकता न हो। सादगी के लिए मैं एक अवरोधन भी शामिल नहीं करता हूं। हम मानक रेखीय प्रतिगमन का उपयोग करके इस प्रतिगमन समस्या को तुरंत हल कर सकते हैं। तो R में ऐसा कुछ होना चाहिए:x1x2xp∼N(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
अंतिम पंक्ति पर ध्यान दें। लगभग सभी रेखीय प्रतीपगमन नियमित प्रयोग QR अपघटन अनुमान लगाने के लिए । हम अपने रिज प्रतिगमन समस्या के लिए उसी का उपयोग करना चाहते हैं। इस बिंदु पर @whuber द्वारा इस पोस्ट को पढ़ा ; हम वास्तव में इस प्रक्रिया को लागू करेंगे । संक्षेप में, हम अपने मूल डिजाइन मैट्रिक्स को एक विकर्ण मैट्रिक्स और हमारे प्रतिक्रिया वेक्टर साथ शून्य के साथ । इस तरह हम मूल रिज प्रतिगमन समस्या as जहांβXλ−−√Ipyp(XTX+λI)−1XTy(X¯TX¯)−1X¯Ty¯¯संवर्धित संस्करण का प्रतीक है। इन नोटों से 18-19 की स्लाइड्स को भी पूर्णता के लिए देखें, मैंने उन्हें काफी सीधा पाया। तो R में हम निम्नलिखित कुछ चाहेंगे:
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
और यह काम करता है। ठीक है, इसलिए हमें रिज रिग्रेशन वाला हिस्सा मिला। हम एक और तरीके से हल कर सकते हैं, हालांकि, हम इसे अनुकूलन समस्या के रूप में तैयार कर सकते हैं जहां वर्गों का अवशिष्ट योग लागत कार्य है और फिर इसके विरुद्ध अनुकूलन करें, अर्थात। । इतना ज़रूर है कि हम ऐसा कर सकते हैं: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
जो फिर से उम्मीद के मुताबिक काम करता है। इसलिए अब हम बस इतना चाहते हैं: जहां । जो बस एक ही अनुकूलन समस्या है, लेकिन विवश है ताकि समाधान गैर-नकारात्मक हो।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
जो दिखाता है कि मूल गैर-नकारात्मक रिज प्रतिगमन कार्य को एक सरल विवश अनुकूलन समस्या के रूप में सुधार कर हल किया जा सकता है। कुछ चेतावनी:
- मैं (व्यावहारिक रूप से) सामान्यीकृत भविष्यवाणियों का उपयोग करता था। आपको खुद को सामान्य करने की आवश्यकता होगी।
- एक ही बात के लिए चला जाता है गैर अवरोधन को सामान्य।
- मैं प्रयोग किया जाता
optim
है एल BFGS-बी तर्क। यह सबसे वैनिला आर सॉल्वर है जो सीमा को स्वीकार करता है। मुझे यकीन है कि आपको दर्जनों बेहतर सॉल्वर मिल जाएंगे।
- सामान्य बाधा रैखिक कम-वर्गों की समस्याओं में द्विघात अनुकूलन कार्यों के रूप में सामने आती हैं । यह इस पोस्ट के लिए एक ओवरकिल है लेकिन ध्यान रखें कि जरूरत पड़ने पर आप बेहतर गति प्राप्त कर सकते हैं।
- जैसा कि टिप्पणियों में उल्लेख किया गया है कि आप रिज-रिग्रेशन को संवर्धित-रेखीय-रिग्रेशन भाग के रूप में छोड़ सकते हैं और सीधे रिज कॉस्ट फ़ंक्शन को ऑप्टिमाइज़ेशन समस्या के रूप में एनकोड कर सकते हैं। यह बहुत सरल होगा और यह पद काफी छोटा होगा। तर्क के लिए मैं इस दूसरे समाधान को भी जोड़ता हूं।
- मैं पायथन में पूरी तरह से संवादी नहीं हूं, लेकिन अनिवार्य रूप से आप इस काम को NumPy के linalg.solve और SciPy के ऑप्टिमाइज़ फ़ंक्शंस का उपयोग करके दोहरा सकते हैं ।
- हाइपरपैरमीटर आदि लेने के लिए आप बस सामान्य सीवी-स्टेप करते हैं जो आप किसी भी स्थिति में करेंगे; कुछ नहीं बदलता है।λ
बिंदु 5 के लिए कोड:
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