এটি একটি দীর্ঘ উত্তর । সুতরাং, আসুন এটির একটি ছোট গল্পের সংস্করণ দিন।
- এই মূল-অনুসন্ধানের সমস্যার কোনও ভাল বীজগণিত সমাধান নেই, সুতরাং আমাদের একটি সংখ্যার অ্যালগরিদম প্রয়োজন need
- ফাংশন df(λ) চমৎকার বৈশিষ্ট্য প্রচুর আছে। প্রতিটি রুটে গ্যারান্টিযুক্ত একঘেয়েমি মিশ্রণ সহ এই সমস্যার জন্য নিউটনের পদ্ধতির একটি বিশেষ সংস্করণ তৈরি করতে আমরা এগুলি কাজে লাগাতে পারি ।
- এমনকি মস্তিষ্ক-মৃত
R
কোডটি অপ্টিমাইজেশনের কোনও প্রয়াস অনুপস্থিত থাকলেও পি = 100 এর সাথে 100 আকারের একটি গ্রিড গণনা করতে পারেকয়েক সেকেন্ডে 000 সাবধানতার সাথে লিখিতকোড কমপক্ষে 2-3 মাপের অর্ডার দ্বারা এটি হ্রাস করবে।p=100000C
একচেটিয়া রূপান্তর নিশ্চিত করার জন্য নীচে দুটি স্কিম দেওয়া আছে। একটি নীচে দেখানো সীমা ব্যবহার করে, যা উপলক্ষে নিউটনের দুটি পদক্ষেপ বাঁচাতে সহায়তা করে বলে মনে হচ্ছে।
উদাহরণ : এবং আকার 100 eigenvalues স্বাধীনতার ডিগ্রী জন্য একটি অভিন্ন গ্রিড Pareto-বিতরণ, অত: পর অত্যন্ত স্কিউ হয়। নীচে প্রতিটি মূল সনাক্ত করার জন্য নিউটন পদক্ষেপের সংখ্যার সারণী রয়েছে।p=100000
# 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
There won't be a closed-form solution for this, in general, but there is a lot of structure present which can be used to produce very effective and safe solutions using standard root-finding methods.
Before digging too deeply into things, let's collect some properties and consequences of the function
df(λ)=∑i=1pd2id2i+λ.
প্রপার্টি 0 : একটি মূলদ ফাংশন λ । (এই সংজ্ঞা থেকে আপাত।)
আখের 0 : কোন সাধারণ বীজগাণিতিক সমাধান রুট খোঁজার জন্য বিদ্যমান থাকবে ঘ চ ( λ ) - Y = 0 । এটি কারণ ডিগ্রি পি এর সমতুল্য বহু -মূল মূল সন্ধানের সমস্যা রয়েছে এবং তাই পি যদি খুব ছোট না হয় (অর্থাত্ পাঁচটিরও কম নয়) তবে কোনও সাধারণ সমাধানের অস্তিত্ব থাকবে না। সুতরাং, আমাদের একটি সংখ্যার পদ্ধতি প্রয়োজন।dfλ
df(λ)−y=0pp
সম্পত্তি 1 : ফাংশন উত্তল এবং λ ≥ 0 এ হ্রাস পাচ্ছে । (ডেরিভেটিভস নিন))
ফলাফল 1 (ক) : নিউটনের রুট-ফাইন্ডিং অ্যালগরিদম এই পরিস্থিতিতে খুব সুন্দর আচরণ করবে । যাক Y স্বাধীনতার আর কাঙ্খিত ডিগ্রী হতে λ 0 সংশ্লিষ্ট রুট, অর্থাত্, Y = ঘ চ ( λ 0 ) । বিশেষত, আমরা যদি কোনও প্রাথমিক মান λ 1 < λ 0 (তাই, ডি চ ( λ 1) দিয়ে শুরু করিdfλ≥0
yλ0y=df(λ0)λ1<λ0 ), তারপরে নিউটন-পদক্ষেপ পুনরাবৃত্তির ক্রম λ 1 , λ 2 , … একচেটিয়াভাবেঅনন্য সমাধান λ 0 এ রূপান্তরিত করবে।
ফলাফল 1 (খ): তদ্ব্যতীত, আমরা যদি λ 1 > λ 0 দিয়ে শুরু করিতবেপ্রথমধাপে λ 2 ≤ λ 0 পাওয়া যায়df(λ1)>yλ1,λ2,…λ0
λ1>λ0λ2≤λ0, কোথা থেকে এটি পূর্বের ফলাফলের দ্বারা সমাধানটিতে একঘেয়েভাবে বৃদ্ধি পাবে (নীচে ক্যাভিয়েট দেখুন)। স্বজ্ঞাতভাবে, এই শেষ ঘটনাটি অনুসরণ করে কারণ আমরা যদি মূলের ডানদিকে যেতে শুরু করি তবে এর জলের কারণে ডেরিভেটিভ "খুব" অগভীর এবং সুতরাং প্রথম নিউটন পদক্ষেপটি আমাদের মূলের বাম দিকে কোথাও নিয়ে যাবে। বিশেষ দ্রষ্টব্য যেহেতু ঘ চ হয় না নেতিবাচক সাধারণ উত্তল মধ্যে λ , এই আকাঙ্ক্ষিত রুট বাম শুরু পছন্দ একটি শক্তিশালী কারণ প্রদান করে। অন্যথায়, আমাদের দ্বিগুণ পরীক্ষা করে দেখতে হবে যে নিউটন পদক্ষেপটি অনুমান মূলের জন্য কোনও নেতিবাচক মানের ফলস্বরূপ ফল দেয়নি, যা আমাদেরকে ডি চ এর একটি ননকনভেক্স অংশে কোথাও স্থাপন করতে পারে ।
dfdfλdf
ফলস্বরূপ 1 (সি) : একবার আমরা কিছু জন্য মূলটি খুঁজে পেয়েছি এবং তারপরে কিছু y 2 < y 1 থেকে রুট অনুসন্ধান করব , λ 1 যেমন d f ( λ 1 ) = y 1 কে আমাদের প্রাথমিক অনুমান হিসাবে ব্যবহার করব গ্যারান্টি আমরা দ্বিতীয় রুটের বাম দিকে শুরু। সুতরাং, আমাদের কনভার্জেশনটি সেখান থেকে একঘেয়ে হওয়ার গ্যারান্টিযুক্ত।y1y2<y1λ1df(λ1)=y1
সম্পত্তি 2 : "নিরাপদ" শুরুর পয়েন্ট দেওয়ার জন্য যুক্তিসঙ্গত সীমা বিদ্যমান। উত্তেজক যুক্তি এবং জেনসেনের অসমতা ব্যবহার করে আমাদের নীচের সীমাবদ্ধতা রয়েছে
p1+λp∑d−2i≤df(λ)≤p∑id2i∑id2i+pλ.
Consequence 2: This tells us that the root
λ0 satisfying
df(λ0)=y obeys
11p∑id−2i(p−yy)≤λ0≤(1p∑id2i)(p−yy).(⋆)
d2i
di>0idipdidf(0)=p assuming all di>0, then y∈(0,p], whence the bounds are always nontrivial (e.g., the lower bound is always nonnegative).
Here is a plot of a "typical" example of df(λ) with p=400. We've superimposed a grid of size 10 for the degrees of freedom. These are the horizontal lines in the plot. The vertical green lines correspond to the lower bound in (⋆).
An algorithm and some example R code
A very efficient algorithm given a grid of desired degrees of freedom y1,…yn in (0,p] is to sort them in decreasing order and then sequentially find the root of each, using the previous root as the starting point for the following one. We can refine this further by checking if each root is greater than the lower bound for the next root, and, if not, we can start the next iteration at the lower bound instead.
Here is some example code in R
, with no attempts made to optimize it. As seen below, it is still quite fast even though R
is—to put it politely—horrifingly, awfully, terribly slow at loops.
# 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)))
}
Below is the final full algorithm which takes a grid of points, and a vector of the di (not 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
}
Sample function call
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)