रिज प्रतिगमन को लागू करना:


17

मैं पायथन / सी मॉड्यूल में रिज रिग्रेशन लागू कर रहा हूं, और मैं इस "छोटी" समस्या को लेकर आया हूं। विचार यह है कि मैं और अधिक या कम समान अंतराल पर स्थित (जैसे स्वतंत्रता के प्रभावी डिग्री नमूने के लिए चाहते हैं "सांख्यिकीय लर्निंग के तत्वों" पृष्ठ पर 65 पर साजिश , यानी, नमूना):

df(λ)=i=1pdi2di2+λ,
जहां, मैट्रिक्सहैं,से। पहली सीमा निर्धारित करने का एक आसान तरीका यह है कि(संभालने वाला), जहाँएक छोटा स्थिर और प्रतिनिधित्व करता है apro लगभग पूरी तरह से स्वतंत्रता की न्यूनतम डिग्री जिसे आप नमूना करना चाहते हैं (जैसे)। दूसरी सीमा निश्चित रूप से\ lambda _ {\ min} = 0 हैdi2XTXdf(λmax)0df(λmin)=pλmax=ipdi2/cλmaxdi2cc=0.1λmin=0

शीर्षक से पता चलता है, तो, मैं नमूना करने की जरूरत है से को कुछ पैमाने में ऐसा है कि \ mathrm {df} (\ lambda) नमूना (लगभग), कहते हैं, में C से p तक 0.1 अंतराल ... क्या ऐसा करने का एक आसान तरीका है? मैंने सोचा था कि न्यूटन-रफसन विधि का उपयोग करके प्रत्येक \ lambda के लिए समीकरण \ mathrm {df} (\ lambda) , लेकिन यह बहुत पुनरावृत्तियों को जोड़ देगा, विशेष रूप से जब पी बड़ी है। कोई सुझाव?λλminλmaxdf(λ)0.1cpdf(λ)λp


1
यह फ़ंक्शन \ lambda \ geq 0 का घटता उत्तल तर्कसंगत कार्य है λ0। जड़ें, खासकर अगर एक डायडिक ग्रिड पर चुना जाता है, तो इसे खोजने के लिए बहुत जल्दी होना चाहिए।
कार्डिनल

@ कार्डिनल, आप शायद सही हैं। हालाँकि, यदि संभव हो तो, मैं जानना चाहूंगा कि क्या कुछ "डिफ़ॉल्ट" ग्रिड है। उदाहरण के लिए, मैंने , जहाँ , और कर ग्रिड प्राप्त करने का प्रयास किया आजादी के कुछ डिग्री के लिए बहुत अच्छा काम किया, लेकिन जैसा कि , यह बाहर उड़ा दिया। इससे मुझे आश्चर्य हुआ कि शायद के ग्रिड को चुनने का कुछ साफ-सुथरा तरीका था , जो मैं पूछ रहा हूं। यदि यह मौजूद नहीं है, तो मुझे यह जानकर भी खुशी होगी (जैसा कि मैं अपने कोड में न्यूटन-राफसन विधि को खुशी से जान सकता हूं कि "कोई बेहतर तरीका मौजूद नहीं है")। रों = ( 1 , 2 , , रों हूँ एक एक्स ) ( λ ) पी λλ=log(s)λmax/log(smax)s=(1,2,...,smax)df(λ)pλ
Néstor

संभावित कठिनाइयों का एक बेहतर विचार प्राप्त करने के लिए, आप विशिष्ट और सबसे खराब मामले क्या हैं ? वहाँ कुछ भी आप eigenvalue वितरण के बारे में एक प्राथमिकता पता है ? p
कार्डिनल

@cardinal, मेरे आवेदन में विशिष्ट मूल्य से , लेकिन मैं इसे यथासंभव सामान्य बनाना चाहता हूं। आइजनवेल्यू वितरण के बारे में, वास्तव में बहुत कुछ नहीं। एक मैट्रिक्स है जिसमें स्तंभों में भविष्यवक्ता होते हैं, जो हमेशा ऑर्थोगोनल नहीं होते हैं। 15 40 एक्सp1540X
Néstor

1
न्यूटन-रफसन आमतौर पर जड़ों को 1012 सटीकता के लिए पी = 40 और df (\ lambda) के छोटे मूल्यों के लिए 3 से 4 चरणों के भीतर पाता है ; लगभग 6 चरणों से अधिक कभी नहीं । बड़े मूल्यों के लिए, कभी-कभी 30 चरणों तक की आवश्यकता होती है। चूंकि प्रत्येक चरण में ओ (पी) गणना की आवश्यकता होती है , गणना की कुल राशि असंगत है। वास्तव में, चरणों की संख्या पी पर निर्भर नहीं लगती है यदि एक अच्छा प्रारंभिक मूल्य चुना जाता है (मैं आपको वह उपयोग करूंगा यदि सभी d_i उनके माध्य के बराबर हैं)। p=40df(λ)630O(p)pdi
whuber

जवाबों:


19

यह एक लंबा जवाब है । तो, चलो यहाँ एक लघु-कहानी संस्करण दें।

  • इस जड़-खोज समस्या का कोई अच्छा बीजगणितीय समाधान नहीं है, इसलिए हमें एक संख्यात्मक एल्गोरिथ्म की आवश्यकता है।
  • फ़ंक्शन df(λ) में बहुत सारे अच्छे गुण हैं। हम इस समस्या के लिए न्यूटन की विधि का एक विशेष संस्करण बनाने के लिए इनका उपयोग कर सकते हैं, जिसमें प्रत्येक रूट के लिए गारंटी मोनोटोनिक अभिसरण है।
  • यहां तक ​​कि ब्रेन-डेड Rकोड अनुपस्थिति में कोई भी प्रयास अनुपस्थित कुछ सेकंड में साथ आकार 100 की ग्रिड की गणना कर सकता है । सावधानीपूर्वक लिखा गया कोड इसे परिमाण के कम से कम २-३ क्रमों से कम कर देगा।p=100000C

नीरस अभिसरण की गारंटी के लिए नीचे दो योजनाएँ दी गई हैं। एक नीचे दिखाए गए सीमा का उपयोग करता है, जो न्यूटन के कदम या दो अवसरों को बचाने में मदद करता है।

उदाहरण : p=100000 और आकार 100 की स्वतंत्रता की डिग्री के लिए एक समान ग्रिड। ईजेनवेल्यूज़ पारेटो-वितरित हैं, इसलिए अत्यधिक तिरछा। नीचे प्रत्येक रूट को खोजने के लिए न्यूटन के चरणों की संख्या दी गई है।

# Table of Newton iterations per root.
# Without using lower-bound check.
  1  3  4  5  6 
  1 28 65  5  1 
# Table with lower-bound check.
  1  2  3 
  1 14 85 

इस के लिए एक पूर्ण-सूत्र समाधान नहीं होगा , सामान्य रूप में, लेकिन वहाँ है संरचना मौजूद है जो मानक जड़ खोजने तरीकों का उपयोग कर बहुत प्रभावी और सुरक्षित समाधान का उत्पादन किया जा सकता है की एक बहुत कुछ।

चीजों में बहुत गहराई से खुदाई करने से पहले, चलिए कुछ गुणों और परिणामों को एकत्रित करते हैं।

df(λ)=i=1pdi2di2+λ.

संपत्ति 0 : का एक तर्कसंगत समारोह है । (यह परिभाषा से स्पष्ट है।) परिणाम 0 : रूट खोजने के लिए कोई सामान्य बीजीय समाधान मौजूद नहीं होगा । ऐसा इसलिए है क्योंकि डिग्री की समतुल्य बहुपद मूल-खोज समस्या है और इसलिए यदि बहुत छोटा नहीं है (यानी, पांच से कम), तो कोई सामान्य समाधान मौजूद नहीं होगा। तो, हमें एक संख्यात्मक विधि की आवश्यकता होगी। λdfλ
df(λ)y=0पीpp

गुण 1 : फ़ंक्शन उत्तल है और पर घट रहा है । (डेरिवेटिव लें।) परिणाम 1 (ए) : न्यूटन की जड़-खोज एल्गोरिथ्म इस स्थिति में बहुत अच्छी तरह से व्यवहार करेगा । चलो स्वतंत्रता और के वांछित डिग्री इसी जड़, यानी, । विशेष रूप से, यदि हम किसी भी प्रारंभिक मान (इसलिए, ) के साथ शुरू करते हैं, तो न्यूटन-स्टेप पुनरावृत्तियों मोनोटोनिक रूप से अभिसरण करेगा अद्वितीय समाधान λ 0dfλ0
λ 0 y = d f ( λ 0 )yλ0y=df(λ0)λ1<λ0df(λ1)>yλ1,λ2,λ0
परिणाम 1 (बी) : इसके अलावा, अगर हम साथ शुरू करना चाहते थे , तो पहला कदम , जहां से यह पिछले परिणाम द्वारा समाधान के लिए वृद्धि होगी (देखें चेतावनी देखें) नीचे)। सहज रूप से, यह अंतिम तथ्य इस प्रकार है क्योंकि अगर हम रूट के दाईं ओर शुरू करते हैं, तो व्युत्पन्न " के उत्तलता के कारण "बहुत" उथला है और इसलिए पहला न्यूटन कदम हमें रूट के बाईं ओर कहीं ले जाएगा। एनबी के बाद से है नहीं नकारात्मक के लिए सामान्य उत्तल मेंλ1>λ0λ2λ0dfdfλ, यह वांछित जड़ के बाईं ओर शुरू करने के लिए एक मजबूत कारण प्रदान करता है। अन्यथा, हमें यह जांचने की आवश्यकता है कि न्यूटन के कदम का अनुमानित रूट के लिए नकारात्मक मूल्य नहीं है, जो हमें कहीं न कहीं गैर-संवेदी हिस्से में रख सकता है । परिणाम 1 (ग) : एक बार जब हम कुछ के लिए जड़ पाया है और फिर से जड़ की तलाश कर रहे कुछ , का उपयोग कर ऐसी है कि हमारी प्रारंभिक अनुमान की गारंटी देता है के रूप में हम करने के लिए शुरू दूसरी जड़ के बाईं ओर। इसलिए, हमारे अभिसरण की गारंटी है कि वहां से मोनोटोनिक होना चाहिए।df
y1y2<y1λ1df(λ1)=y1

संपत्ति 2 : उचित सीमा "सुरक्षित" शुरुआती बिंदु देने के लिए मौजूद हैं। उत्तलता तर्कों और जेन्सेन की असमानता का उपयोग करते हुए, हम निम्नलिखित सीमा है परिणाम 2: यह हमें बताता है कि रूट λ 0 संतोषजनक d f ( λ 0 ) = y obeys 1

p1+λpdi2df(λ)pidi2idi2+pλ.
λ0df(λ0)=y अतः, एक सामान्य स्थिरांक तक, हमनेd 2 i के हार्मोनिक और अंकगणितीय साधनों के बीच में जड़ जमाई है।
()11pidi2(pyy)λ0(1pidi2)(pyy).
di2

यह मानता है कि सभी i के लिए । अगर ऐसा नहीं है, तो एक ही बाध्य विचार करके रखती है केवल सकारात्मक मैं और की जगह पी सकारात्मक की संख्या से मैंनायब : चूंकि ( 0 ) = पी यह सोचते हैं सब मैं > 0 , तो y ( 0 , पी ] , जिस कारण से सीमा हमेशा nontrivial (हैं जैसे, लोअर बाउंड हमेशा गैर नकारात्मक है)।di>0idipdidf(0)=pdi>0y(0,p]

यहाँ p = 400 के साथ "विशिष्ट" उदाहरण का एक कथानक है । हमने स्वतंत्रता की डिग्री के लिए आकार 10 का एक ग्रिड तैयार किया है। ये कथानक की क्षैतिज रेखाएँ हैं। खड़ी हरी लाइनों कम में बंधे के अनुरूप ( )df(λ)p=400()

Example dof plot with grid and bounds

एक एल्गोरिथ्म और कुछ उदाहरण आर कोड

एक बहुत ही कुशल एल्गोरिदम ने स्वतंत्रता की वांछित डिग्री का एक ग्रिड दिया , ... y n in ( 0 , p ] उन्हें घटते क्रम में क्रमबद्ध करना है और फिर क्रमिक रूप से प्रत्येक के मूल को ज्ञात करना है , पिछले मूल का उपयोग करना। निम्नलिखित में से। हम यह जांच कर सकते हैं कि अगली जड़ के लिए प्रत्येक बाउंड निचली बाउंड से अधिक है या नहीं, और यदि नहीं, तो हम इसकी बाउंड्री को निम्न बाउंड पर शुरू कर सकते हैं।y1,yn(0,p]

इसमें कुछ उदाहरण कोड है R, जिसमें इसे अनुकूलित करने के लिए कोई प्रयास नहीं किया गया है। जैसा कि नीचे देखा गया है, यह अभी भी काफी तेज है, भले ही Rइसे विनम्रता से रखा जाए - भयानक रूप से, भयानक रूप से, छोरों पर बहुत धीमी गति से।

# Newton's step for finding solutions to regularization dof.

dof <- function(lambda, d) { sum(1/(1+lambda / (d[d>0])^2)) }
dof.prime <- function(lambda, d) { -sum(1/(d[d>0]+lambda / d[d>0])^2) }

newton.step <- function(lambda, y, d)
{ lambda - (dof(lambda,d)-y)/dof.prime(lambda,d) }

# Full Newton step; Finds the root of y = dof(lambda, d).
newton <- function(y, d, lambda = NA, tol=1e-10, smart.start=T)
{
    if( is.na(lambda) || smart.start )
        lambda <- max(ifelse(is.na(lambda),0,lambda), (sum(d>0)/y-1)/mean(1/(d[d>0])^2))
    iter <- 0
    yn   <- Inf
    while( abs(y-yn) > tol )
    {
        lambda <- max(0, newton.step(lambda, y, d)) # max = pedantically safe
        yn <- dof(lambda,d)
        iter = iter + 1
    }
    return(list(lambda=lambda, dof=y, iter=iter, err=abs(y-yn)))
}

नीचे अंतिम पूर्ण एल्गोरिथ्म है जो अंकों की एक ग्रिड लेता है, और का वेक्टर ( नहीं d 2 i !)।di di2

newton.grid <- function(ygrid, d, lambda=NA, tol=1e-10, smart.start=TRUE)
{
    p <- sum(d>0)
    if( any(d < 0) || all(d==0) || any(ygrid > p) 
        || any(ygrid <= 0) || (!is.na(lambda) && lambda < 0) )
        stop("Don't try to fool me. That's not nice. Give me valid inputs, please.")
    ygrid <- sort(ygrid, decreasing=TRUE)
    out    <- data.frame()
    lambda <- NA
    for(y in ygrid)
    {
        out <- rbind(out, newton(y,d,lambda, smart.start=smart.start))
        lambda <- out$lambda[nrow(out)]
    }
    out
}

नमूना समारोह कॉल

set.seed(17)
p <- 100000
d <- sqrt(sort(exp(rexp(p, 10)),decr=T))
ygrid <- p*(1:100)/100
# Should take ten seconds or so.
out <- newton.grid(ygrid,d)

सवाल के अनुकूल इसलिए मैं इस जवाब पर वापस लौट सकता हूं। इस विस्तृत विश्लेषण, कार्डिनल को पोस्ट करने के लिए धन्यवाद।
मैक्रों

अद्भुत उत्तर :-), सुझाव और जवाब के लिए बहुत बहुत धन्यवाद।
Néstor

1

इसके अलावा, कुछ तरीके मौजूद हैं जो पूर्ण नियमितीकरण पथ की कुशलता से गणना करेंगे:

  1. GPS
  2. glmnet
  3. gcdnet

उपरोक्त सभी आर पैकेज हैं, जैसा कि आप पायथन का उपयोग कर रहे हैं, स्किटिट-लर्न में रिज, लास्सो और इलास्टिक नेट के लिए कार्यान्वयन शामिल हैं।


1
olsआर में समारोह rmsपैकेज संख्यात्मक अनुकूलन का उपयोग प्रभावी AIC का उपयोग कर अधिकतम जुर्माना लगाने के लिए कर सकते हैं। लेकिन आपको अधिकतम जुर्माना देना होगा जो हमेशा आसान नहीं होता है।
फ्रैंक हार्ले

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.