Bagaimana cara menghitung parameter regularisasi dalam regresi ridge yang diberikan derajat kebebasan dan matriks input?

11

Misalkan A menjadi matriks variabel independen dan B menjadi matriks dari nilai-nilai dependen. Dalam regresi ridge, kita mendefinisikan parameter sehingga: . Sekarang mari [usv] = svd (A) dan entri diagonal 's'. kita mendefinisikan derajat kebebasan (df) = . Regresi Ridge menyusut koefisien komponen varians rendah dan karenanya parameter mengontrol derajat kebebasan. Jadi untukn × 1 λ ß = ( A T A + λ I ) - 1 A T B d i = i t h Σ n i = 1 ( d i ) 2n×pn×1λβ=(ATA+λI)1ATBdi=ith λλ=0i=1n(di)2(di)2+λλλ=0, yang merupakan kasus regresi normal, df = n, dan karenanya semua variabel independen akan dipertimbangkan. Masalah yang saya hadapi adalah menemukan nilai diberikan 'df' dan matriks 's'. Saya telah mencoba mengatur ulang persamaan di atas tetapi tidak mendapatkan solusi bentuk tertutup. Harap berikan petunjuk bermanfaat.λ

Amit
sumber
Yah saya perlu waktu untuk menjawab ini (mungkin orang lain akan lebih cepat membantu Anda), tetapi sebagian besar wawasan dapat diambil dari stat.lsa.umich.edu/~kshedden/Courses/Stat600/Notes/… Dan apa yang dalam definisi derajat kebebasan, karena entah bagaimana saya merindukan . λkλ
Dmitrij Celov
@ Dmitrij: Thnx untuk balasan, saya telah memperbarui pertanyaan, dan mengganti 'k' denganλ
Amit
Hai Amit, bagaimana Anda bisa mengetahui derajat kebebasan sebelum menghitung parameter regularisasi?
Baz

Jawaban:

9

Algoritma Newton-Raphson / Fisher-scoring / Taylor-series akan cocok untuk ini.

Anda memiliki persamaan untuk dipecahkan untuk dengan turunan Anda kemudian mendapatkan: h ( λ ) = p i = 1 d 2 iλ

h(λ)=i=1pdi2di2+λdf=0
h(λ)h(λ(0))+(λ-λ(0))h
hλ=i=1pdi2(di2+λ)2
h(λ)h(λ(0))+(λλ(0))hλ|λ=λ(0)=0

mengatur ulang untuk Anda dapatkan: Ini mengatur pencarian berulang. Untuk nilai awal awal, asumsikan dalam penjumlahan, maka Anda mendapatkan .λ = λ ( 0 ) - [ hλd 2 i =1λ(0)=p-df

λ=λ(0)[hλ|λ=λ(0)]1h(λ(0))
di2=1λ(0)=pdfdf

λ(j+1)=λ(j)+[i=1pdi2(di2+λ(j))2]1[i=1pdi2di2+λ(j)df]

Ini "berjalan" ke arah yang benar (meningkatkan ketika penjumlahan terlalu besar, kurangi ketika terlalu kecil), dan biasanya hanya membutuhkan beberapa iterasi untuk menyelesaikannya. Lebih lanjut fungsinya adalah monoton (peningkatan / penurunan akan selalu mengurangi / menambah penjumlahan), sehingga akan menyatu secara unik (tidak ada maxima lokal).λλλ

probabilityislogic
sumber
thnx banyak, tapi saya ragu mengapa kita harus menganggap , karena kita sudah memiliki nilai yang benar ... Saya telah memeriksa rumus ini dengan menulis kode matlab dan belum mengambil asumsi itu , tetapi berfungsi dengan baik dan memberikan solusi yang tepatdi2=1
Amit
Asumsinya hanya untuk mendapatkan nilai awal "cukup dekat" dengan nilai yang benar. Jika Anda memiliki tebakan yang lebih baik, maka mulailah dengan itu. Anda bahkan bisa mengatur , selama d Anda lebih besar dari nol. D tidak diasumsikan 1 dalam iterasi, hanya untuk memulai algoritma. λ ( 0 ) = 0λ(0)λ(0)=0
probabilityislogic
(+1) Saya tetap akan memberikan solusi numerik yang sama.
Dmitrij Celov
6

Berikut adalah kode Matlab kecil berdasarkan rumus yang dibuktikan oleh probabilityislogic:

function [lamda] = calculate_labda(Xnormalised,df)
    [n,p] = size(Xnormalised);   

    %Finding SVD of data
    [u s v]=svd(Xnormalised);
    Di=diag(s);
    Dsq=Di.^2;

    %Newton-rapson method to solve for lamda
    lamdaPrev=(p-df)/df;
    lamdaCur=Inf;%random large value
    diff=lamdaCur-lamdaPrev;   
    threshold=eps(class(XstdArray));    
    while (diff>threshold)          
        numerator=(sum(Dsq ./ (Dsq+lamdaPrev))-df);        
        denominator=sum(Dsq./((Dsq+lamdaPrev).^2));        
        lamdaCur=lamdaPrev+(numerator/denominator);        
        diff=lamdaCur-lamdaPrev;        
        lamdaPrev=lamdaCur;        
    end
    lamda=lamdaCur;
end
Amit
sumber
2
Ayo tim!
probabilityislogic
Editor percobaan berpendapat bahwa kondisi sementara seharusnya while ( abs(diff)>threshold ).
gung - Reinstate Monica
Saya memposting ini sebagai jawaban alternatif untuk kode yang diposting oleh @Amit. Saya menyarankan agar perbandingan dengan ambang batas di while( abs(diff) > threshold )karena toleransi untuk perbedaan harus dapat dicapai dari kiri dan kanan. Misalnya misalkan diff = dan threshold = maka kondisi loop salah, tetapi jelas solusinya belum konvergen. 1 e - 161001e16
heuristicwondering