Đây là một câu trả lời dài . Vì vậy, hãy đưa ra một phiên bản truyện ngắn của nó ở đây.
- Không có giải pháp đại số tốt cho vấn đề tìm kiếm gốc này, vì vậy chúng tôi cần một thuật toán số.
- Chức năng có nhiều đặc tính tốt đẹp. Chúng ta có thể khai thác những điều này để tạo ra một phiên bản chuyên biệt của phương pháp Newton cho vấn đề này với sự hội tụ đơn điệu được đảm bảo cho mỗi gốc.df(λ)
- Ngay cả
R
mã chết não cũng không có bất kỳ nỗ lực tối ưu hóa nào cũng có thể tính toán lưới có kích thước 100 với trong vài giây. Mãđược viết cẩn thậnsẽ làm giảm ít nhất 2 đơn hàng độ lớn.p=100000C
Có hai phương án được đưa ra dưới đây để đảm bảo sự hội tụ đơn điệu. Người ta sử dụng các giới hạn được hiển thị bên dưới, dường như giúp lưu một hoặc hai bước Newton.
Ví dụ : và một lưới thống nhất cho các bậc tự do kích thước 100. Các giá trị riêng được phân phối theo Pareto, do đó rất sai lệch. Dưới đây là bảng số lượng các bước Newton để tìm từng gốc.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
Sẽ không có một giải pháp hình thức đóng cho điều này , nói chung, nhưng có là rất nhiều cấu trúc hiện tại có thể được sử dụng để tạo ra các giải pháp rất hiệu quả và an toàn sử dụng phương pháp gốc tìm hiểu tiêu chuẩn.
Trước khi đào quá sâu vào sự vật, chúng ta hãy thu thập một số tính chất và hậu quả của hàm
df(λ)=∑i=1pd2id2i+λ.
Sở hữu 0 : là một hàm hợp lý của λ . (Điều này là rõ ràng từ định nghĩa.)
Hậu quả 0 : Không có giải pháp đại số nói chung sẽ tồn tại cho việc tìm kiếm các thư mục gốc d f ( λ ) - y = 0 . Điều này là do có một vấn đề tìm gốc đa thức tương đương bậc p và vì vậy nếu p không quá nhỏ (tức là dưới năm), sẽ không có giải pháp chung nào tồn tại. Vì vậy, chúng ta sẽ cần một phương pháp số.dfλ
df(λ)−y=0pp
Sở hữu 1 : Chức năng là lồi và giảm trên bước sóng ≥ 0 . (Lấy đạo hàm.)
Hậu quả 1 (a) : Thuật toán tìm kiếm gốc của Newton sẽ hành xử rất độc đáo trong tình huống này. Hãy để y là độ mong muốn tự do và λ 0 gốc tương ứng, ví dụ, y = d f ( λ 0 ) . Đặc biệt, nếu chúng ta bắt đầu với bất kỳ giá trị ban đầu λ 1 < λ 0 (vì vậy, d f ( λ 1dfλ≥0
yλ0y=df(λ0)λ1<λ0 ), sau đó trình tự các bước lặp Newton-bước bước sóng 1 , λ 2 , ... sẽ hội tụđơn điệuvới các giải pháp độc đáo λ 0 .
Kết quả 1 (b): Hơn nữa, nếu chúng ta bắt đầu với λ 1 > λ 0 , thìđầu tiênbước sẽ mang lại λ 2 ≤ λ 0df(λ1)>yλ1,λ2,…λ0
λ1> λ0λ2≤ λ0, từ đó nó sẽ tăng đơn điệu đến giải pháp do hậu quả trước đó (xem cảnh báo bên dưới). Theo trực giác, thực tế cuối cùng này xảy ra bởi vì nếu chúng ta bắt đầu ở bên phải của gốc, đạo hàm là "quá" nông do sự lồi lõm của và vì vậy bước Newton đầu tiên sẽ đưa chúng ta đến một nơi nào đó ở bên trái của gốc. NB Từ d f là không trong lồi chung của tiêu cực λ , điều này cung cấp một lý do mạnh mẽ để thích bắt đầu từ phía bên trái của gốc mong muốn. Mặt khác, chúng ta cần kiểm tra kỹ xem bước Newton không dẫn đến giá trị âm cho gốc ước tính, có thể đặt chúng ta ở đâu đó trong phần không xác định của d f .
d fd fλd f
Kết quả 1 (c) : Một khi chúng ta đã tìm thấy các gốc cho một số và sau đó tìm kiếm nguồn gốc từ một số y 2 < y 1 , sử dụng λ 1 mà d f ( λ 1 ) = y 1 như đoán ban đầu của chúng tôi đảm bảo chúng tôi bắt đầu ở bên trái của gốc thứ hai. Vì vậy, sự hội tụ của chúng tôi được đảm bảo là đơn điệu từ đó.y1y2<y1λ1df(λ1)=y1
Thuộc tính 2 : Giới hạn hợp lý tồn tại để cho điểm khởi đầu "an toàn". Sử dụng các đối số lồi và bất đẳng thức của Jensen, chúng ta có các giới hạn sau
Hậu quả 2: Điều này cho chúng ta biết rằng gốc rễ bước sóng 0 thỏa mãn d f ( λ 0 ) = y tuân theo
1
p1+λp∑d−2i≤df(λ)≤p∑id2i∑id2i+pλ.
λ0df(λ0)=y
Vì vậy, đến một hằng số chung, chúng ta đã kẹp gốc giữa các phương tiện số học và số học của
d 2 i .
11p∑id−2i(p−yy)≤λ0≤(1p∑id2i)(p−yy).(⋆)
d2i
Điều này giả định rằng cho tất cả i . Nếu đây không phải là trường hợp, thì cùng một ràng buộc bằng cách chỉ xem xét dương d i và thay p bằng số dương d i . NB : Vì d f ( 0 ) = p giả sử tất cả d i > 0 , sau đó y ∈ ( 0 , p ] , vì vậy các giới hạn luôn luôn không có giá trị (ví dụ: giới hạn dưới luôn luôn không âm).di>0idipdidf(0)=pdi>0y∈(0,p]
Dưới đây là một âm mưu của một ví dụ "điển hình" của với p = 400 . Chúng tôi đã đặt một lưới kích thước 10 cho các bậc tự do. Đây là những đường ngang trong cốt truyện. Các đường màu xanh lá cây dọc tương ứng với giới hạn dưới trong ( ⋆ ) .df(λ)p=400(⋆)
Một thuật toán và một số ví dụ mã R
Một thuật toán rất hiệu quả cho một mạng lưới các độ mong muốn tự do trong ( 0 , p ] là để sắp xếp chúng theo thứ tự giảm dần và sau đó liên tục tìm ra gốc rễ của mỗi, bằng cách sử dụng gốc trước đó như là điểm khởi đầu cho theo sau. Chúng ta có thể tinh chỉnh điều này hơn nữa bằng cách kiểm tra xem mỗi gốc có lớn hơn giới hạn dưới của gốc tiếp theo hay không, và nếu không, chúng ta có thể bắt đầu lần lặp tiếp theo ở giới hạn dưới thay thế.y1,…yn(0,p]
Dưới đây là một số mã ví dụ R
, không có nỗ lực nào để tối ưu hóa nó. Như đã thấy bên dưới, nó vẫn còn khá nhanh mặc dù R
là một cách lịch sự, đó là một cách lịch sự, khủng khiếp, chậm chạp khủng khiếp .
# 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ưới đây là thuật toán đầy đủ cuối cùng lấy một lưới các điểm và một vectơ của ( không phải 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
}
Gọi hàm mẫu
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)