Como calcular o parâmetro de regularização na regressão de crista dada graus de liberdade e matriz de entrada?

11

Seja A matriz de variáveis ​​independentes e B seja a matriz n × 1 correspondente dos valores dependentes. Na regressão cume, nós definimos um parâmetro λ de forma que: β = ( A T A + X I ) - 1 A T B . Agora vamos [USV] = SVD (A) e de d i = i t h entrada diagonal de 's'. definimos graus de liberdade (df) = Σ n i = 1 ( d i ) 2n×pn×1λβ=(ATA+λI)1ATBdi=ith . A regressão de Ridge reduz os coeficientes dos componentes de baixa variância e, portanto, o parâmetroλcontrola os graus de liberdade.Portanto,paraλ=0, que é o caso da regressão normal, df = n, e, portanto, todas as variáveis ​​independentes serão consideradas. O problema que estou enfrentando é encontrar o valor deλdado 'df' e a matriz 's'. Tentei reorganizar a equação acima, mas não estava obtendo uma solução de formulário fechado. Forneça qualquer indicação útil.i=1n(di)2(di)2+λλλ=0λ

Amit
fonte
Bem, preciso de tempo para responder a isso (provavelmente outros serão mais rápidos para ajudá-lo), mas a maioria das idéias pode ser obtida em stat.lsa.umich.edu/~kshedden/Courses/Stat600/Notes/… E o que é na definição de graus de liberdade, desde que eu perca λ de alguma forma. kλ
Dmitrij Celov
@Dmitrij: Thnx para a resposta, atualizei as perguntas e substituí 'k' por λ
Amit
Oi Amit, como você pode saber quais são os graus de liberdade antes de calcular o parâmetro de regularização?
Baz

Respostas:

9

Um algoritmo de Newton-Raphson / Fisher-scoring / Taylor-series seria adequado para isso.

Você tem a equação para resolver para h ( λ ) = p i = 1 d 2 iλ com derivada h

h(λ)=i=1pdi2di2+λdf=0
Você obtém: h(λ)h(λ(0))+(λ-λ(0))h
hλ=i=1pdi2(di2+λ)2
h(λ)h(λ(0))+(λλ(0))hλ|λ=λ(0)=0

λ

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

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

λλ

probabilityislogic
fonte
di2=1
λ(0)λ(0)=0
(+1) Eu daria a mesma solução numérica de qualquer maneira.
Dmitrij Celov
6

Aqui está o pequeno código do Matlab com base na fórmula comprovada pela 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
fonte
2
Força equipa!
probabilityislogic
Um editor tentado argumenta que a condição while deveria ser while ( abs(diff)>threshold ).
gung - Restabelece Monica
while( abs(diff) > threshold )1001e16