यह एक लंबा जवाब है । तो, चलो यहाँ एक लघु-कहानी संस्करण दें।
- इस जड़-खोज समस्या का कोई अच्छा बीजगणितीय समाधान नहीं है, इसलिए हमें एक संख्यात्मक एल्गोरिथ्म की आवश्यकता है।
- फ़ंक्शन 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=1pd2id2i+λ.
संपत्ति 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+λp∑d−2i≤df(λ)≤p∑id2i∑id2i+pλ.
λ0df(λ0)=y
अतः, एक सामान्य स्थिरांक तक, हमने
d 2 i के हार्मोनिक और अंकगणितीय साधनों के बीच में जड़ जमाई है।
11p∑id−2i(p−yy)≤λ0≤(1p∑id2i)(p−yy).(⋆)
d2i
यह मानता है कि सभी i के लिए । अगर ऐसा नहीं है, तो एक ही बाध्य विचार करके रखती है केवल सकारात्मक घ मैं और की जगह पी सकारात्मक की संख्या से घ मैं । नायब : चूंकि घ च ( 0 ) = पी यह सोचते हैं सब घ मैं > 0 , तो y ∈ ( 0 , पी ] , जिस कारण से सीमा हमेशा nontrivial (हैं जैसे, लोअर बाउंड हमेशा गैर नकारात्मक है)।di>0idipdidf(0)=pdi>0y∈(0,p]
यहाँ p = 400 के साथ "विशिष्ट" उदाहरण का एक कथानक है । हमने स्वतंत्रता की डिग्री के लिए आकार 10 का एक ग्रिड तैयार किया है। ये कथानक की क्षैतिज रेखाएँ हैं। खड़ी हरी लाइनों कम में बंधे के अनुरूप ( ⋆ ) ।df(λ)p=400(⋆)
एक एल्गोरिथ्म और कुछ उदाहरण आर कोड
एक बहुत ही कुशल एल्गोरिदम ने स्वतंत्रता की वांछित डिग्री का एक ग्रिड दिया , ... 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 d2i
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)