गैर-नकारात्मक रिज प्रतिगमन कैसे करें?


10

गैर-नकारात्मक रिज प्रतिगमन कैसे करें? गैर-नकारात्मक लसो में उपलब्ध है scikit-learn, लेकिन रिज के लिए, मैं दांव की गैर-नकारात्मकता को लागू नहीं कर सकता, और वास्तव में, मैं नकारात्मक गुणांक प्राप्त कर रहा हूं। क्या किसी को पता है कि यह क्यों है?

क्या मैं नियमित रूप से कम से कम वर्गों के संदर्भ में रिज को लागू कर सकता हूं? इसे दूसरे प्रश्न पर ले जाया गया: क्या मैं ओएलएस रिग्रेशन के संदर्भ में रिज रिग्रेशन को लागू कर सकता हूं?


1
यहाँ दो काफी ओर्थोगोनल प्रश्न हैं, मैं एक अलग प्रश्न के रूप में "क्या मैं कम से कम वर्गों के संदर्भ में रिज को लागू कर सकता हूं" पर विचार कर रहा हूं।
मैथ्यू डॉरी

जवाबों:


8

" किसी को भी पता है कि यह क्यों है? " के बजाय विरोधी जलवायु उत्तर है कि बस किसी को भी गैर-नकारात्मक रिज प्रतिगमन दिनचर्या को लागू करने के लिए पर्याप्त परवाह नहीं है। मुख्य कारणों में से एक यह है कि लोगों ने पहले से ही गैर-नकारात्मक लोचदार शुद्ध दिनचर्या (उदाहरण के लिए यहां और यहां ) लागू करना शुरू कर दिया है । लोचदार जाल में एक विशेष मामले के रूप में रिज रिग्रेशन शामिल है (एक अनिवार्य रूप से एक शून्य भार करने के लिए LASSO भाग सेट करें)। ये कार्य अपेक्षाकृत नए हैं इसलिए इन्हें अभी तक स्किटिट-लर्न या समान सामान्य उपयोग पैकेज में शामिल नहीं किया गया है। आप कोड के लिए इन कागजात के लेखकों से पूछताछ कर सकते हैं।

संपादित करें:

जैसा कि @amoeba और मैंने टिप्पणियों पर चर्चा की कि इसका वास्तविक कार्यान्वयन सापेक्ष सरल है। कहो कि एक को निम्नलिखित प्रतिगमन समस्या है:

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

जहाँ और दोनों मानक हैं जैसे: । सूचना मैं मानकीकृत भविष्यवक्ता चर का उपयोग करता हूं ताकि मुझे बाद में सामान्य करने की आवश्यकता न हो। सादगी के लिए मैं एक अवरोधन भी शामिल नहीं करता हूं। हम मानक रेखीय प्रतिगमन का उपयोग करके इस प्रतिगमन समस्या को तुरंत हल कर सकते हैं। तो R में ऐसा कुछ होना चाहिए: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

अंतिम पंक्ति पर ध्यान दें। लगभग सभी रेखीय प्रतीपगमन नियमित प्रयोग 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

जो दिखाता है कि मूल गैर-नकारात्मक रिज प्रतिगमन कार्य को एक सरल विवश अनुकूलन समस्या के रूप में सुधार कर हल किया जा सकता है। कुछ चेतावनी:

  1. मैं (व्यावहारिक रूप से) सामान्यीकृत भविष्यवाणियों का उपयोग करता था। आपको खुद को सामान्य करने की आवश्यकता होगी।
  2. एक ही बात के लिए चला जाता है गैर अवरोधन को सामान्य।
  3. मैं प्रयोग किया जाता optimहै एल BFGS-बी तर्क। यह सबसे वैनिला आर सॉल्वर है जो सीमा को स्वीकार करता है। मुझे यकीन है कि आपको दर्जनों बेहतर सॉल्वर मिल जाएंगे।
  4. सामान्य बाधा रैखिक कम-वर्गों की समस्याओं में द्विघात अनुकूलन कार्यों के रूप में सामने आती हैं । यह इस पोस्ट के लिए एक ओवरकिल है लेकिन ध्यान रखें कि जरूरत पड़ने पर आप बेहतर गति प्राप्त कर सकते हैं।
  5. जैसा कि टिप्पणियों में उल्लेख किया गया है कि आप रिज-रिग्रेशन को संवर्धित-रेखीय-रिग्रेशन भाग के रूप में छोड़ सकते हैं और सीधे रिज कॉस्ट फ़ंक्शन को ऑप्टिमाइज़ेशन समस्या के रूप में एनकोड कर सकते हैं। यह बहुत सरल होगा और यह पद काफी छोटा होगा। तर्क के लिए मैं इस दूसरे समाधान को भी जोड़ता हूं।
  6. मैं पायथन में पूरी तरह से संवादी नहीं हूं, लेकिन अनिवार्य रूप से आप इस काम को NumPy के linalg.solve और SciPy के ऑप्टिमाइज़ फ़ंक्शंस का उपयोग करके दोहरा सकते हैं ।
  7. हाइपरपैरमीटर आदि लेने के लिए आप बस सामान्य सीवी-स्टेप करते हैं जो आप किसी भी स्थिति में करेंगे; कुछ नहीं बदलता है।λ

बिंदु 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

1
यह कुछ भ्रामक है। गैर-नकारात्मक रिज प्रतिगमन को लागू करने के लिए तुच्छ है: एक विस्तारित डेटा पर सामान्य प्रतिगमन के रूप में रिज प्रतिगमन को फिर से लिख सकता है ( आँकड़े। कॉन्टेक्सएक्सचेंज.com/questions/203687 पर टिप्पणियां देखें ) और फिर गैर-नकारात्मक प्रतिगमन दिनचर्या का उपयोग करें।
अमीबा

मैं मानता हूं कि इसे लागू करना सरल है (+1 से)। (मैंने पहले तुम्हारा और ग्लेन की टिप्पणी दूसरे धागे पर भी लिखी थी)। सवाल यह है कि क्यों लागू नहीं किया जाता है, अगर यह मुश्किल नहीं है। उस मामले पर, मुझे दृढ़ता से संदेह है कि इस एनएनआरआर कार्य को सीधे तैयार करना एक अनुकूलन समस्या है और यहां तक ​​कि सरल है कि पहले इसे एक विस्तारित डेटा प्रतिगमन के रूप में तैयार करना और फिर क्वाड का उपयोग करना। प्रोग्राम। इस प्रतिगमन को हल करने के लिए अनुकूलन। मैंने अपने उत्तर में यह नहीं कहा क्योंकि यह कार्यान्वयन भाग में उद्यम करेगा।
us --r11852 19:25

या बस इसे स्टेन में लिखें।
साइकोरैक्स का कहना है कि मोनिका

आह ठीक है; मैंने क्यू को मुख्य रूप से यह समझा कि गैर-नकारात्मक रिज कैसे करना है (और केवल यह पूछना कि इसे पारित करने में लागू क्यों नहीं किया गया है); मैंने इसे शीर्षक में रखने के लिए संपादन भी किया। किसी भी मामले में, यह कैसे करना है मुझे एक और दिलचस्प सवाल लगता है। यदि आप अपने उत्तर को गैर-नकारात्मक रिज को लागू करने के तरीके के बारे में स्पष्टीकरण के साथ अपडेट कर सकते हैं, तो मुझे लगता है कि यह भविष्य के पाठकों के लिए बहुत उपयोगी होगा (और मुझे बहुत खुशी होगी :)।
अमीबा

1
कूल, मैं इसे बाद में करूंगा (मैंने नए शीर्षक पर ध्यान नहीं दिया, इसके बारे में खेद है)। मैं शायद OLS / छद्म टिप्पणियों के संदर्भ में कार्यान्वयन दे दूंगा ताकि हम दूसरे प्रश्न का भी उत्तर दें।
us --r11852

4

पैकेज glmnet कि लोचदार नेट को लागू करता है और इसलिए लासो और रिज यह अनुमति देता है। मापदंडों के साथ lower.limitsऔर upper.limits, आप अलग-अलग प्रत्येक वजन के लिए एक न्यूनतम या अधिकतम मान सेट कर सकते हैं, इसलिए यदि आप कम सीमाएं 0 पर सेट करते हैं, तो यह नॉन -गेटिव इलास्टिक-नेट (लासो / रिज) का प्रदर्शन करेगा।

एक अजगर रैपर है https://pypi.python.org/pypi/glmnet/2.0.0


2

याद करें हम हल करने की कोशिश कर रहे हैं:

minimizexAxy22+λx22s.t. x>0

के बराबर है:

minimizexAxy22+λxIxs.t. x>0

कुछ और बीजगणित के साथ:

minimizexxT(ATA+λI)x+(2ATy)Txs.t. x>0

छद्म-अजगर में समाधान बस करना है:

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

देखें: कोई व्यक्ति बिना फॉर्म के रेग्युलर का उपयोग करते हुए नॉन-निगेटिव कम से कम कैसे करता है ?KxRkx

थोड़ा और सामान्य उत्तर के लिए।


क्या लाइन c = - A'y read c = A'y नहीं है? मुझे लगता है कि यह सही है, हालांकि किसी को यह ध्यान रखना चाहिए कि समाधान scipy.optimize.nnls (newMatX, newVecY) से थोड़ा अलग है, जहां newMatX X पंक्ति को विकर्ण मैट्रिक्स (लैम्ब्डा) के साथ विकर्ण के साथ संवर्धित किया गया है और NewVecY Y है। नवर शून्य के साथ संवर्धित। मुझे लगता है कि आप जिस समाधान का उल्लेख करते हैं वह सही है ...
टॉम वेन्सलेर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.