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λ


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)=p−dfdf

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

λλ


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

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 )−1001e−16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.