자유도 및 입력 행렬이 지정된 능선 회귀 분석에서 정규화 매개 변수를 계산하는 방법은 무엇입니까?


11

A 는 독립 변수의 행렬이고 B 는 종속 값 의 해당 행렬입니다. 릿지 회귀에서는 파라미터 정의 되도록 : . 이제 [usv] = svd (A)와 대각선으로 's'를 입력하십시오. 자유도 (df) = 합니다. 릿지 회귀 저 분산 성분의 계수, 따라서 파라미터 수축 위한 컨트롤 freedom.So의도n×pλ β = ( A T A + λ I ) 1 A T B d i = i t hn i = 1 ( d i ) 2n×1λβ=(ATA+λI)1ATBdi=ith λλ=0λi=1n(di)2(di)2+λλλ=0이는 정상적인 회귀의 경우 df = n이므로 모든 독립 변수가 고려됩니다. 내가 겪고있는 문제는 'df'와 행렬 's'가 주어진 의 값을 찾는 것 입니다. 위의 방정식을 다시 정렬하려고했지만 닫힌 양식 솔루션을 얻지 못했습니다. 유용한 정보를 제공해주십시오.λ


그럼 난 필요 시간은 (아마도 다른 사람들이 당신을 돕기 위해 빠를 것이다)이 답변을하지만, 대부분의 통찰력에서 취할 수있다 stat.lsa.umich.edu/~kshedden/Courses/Stat600/Notes/... 그리고 무엇 정의에 어떻게 든 그리워하기 때문에 자유도 . λkλ
Dmitrij Celov

@ Dmitrij : Thnx 답장을 보내, 질문을 업데이트하고 'k'를 로 대체했습니다.λ
Amit

안녕하세요 Amit, 정규화 매개 변수를 계산하기 전에 자유도를 어떻게 알 수 있습니까?
Baz

답변:


9

Newton-Raphson / Fisher-scoring / Taylor 시리즈 알고리즘이 이에 적합합니다.

넌 해결하기 식을위한 으로 유도체 그러면 다음과 같이 얻을 수 있습니다 : h ( λ ) = p i = 1 d 2 iλ

h(λ)=i=1pdi2di2+λdf=0
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]

이것은 올바른 방향 ( 합산이 너무 크면 늘리고 너무 작 으면 줄임) 으로 "가고" 일반적으로 해결하기 위해 몇 번의 반복 만 필요합니다. 또한 함수는 단조 적입니다 ( 의 증가 / 감소 는 항상 합을 감소 / 증가시킵니다). 따라서 고유하게 수렴합니다 (로컬 최대 값 없음).λλλ


thnx는 많이 있지만, 왜 올바른 값을 이미 가지고 있기 때문에 왜 을 가정해야하는지 의심 됩니다. , 그러나 그것은 잘 작동하고 올바른 해결책을 제공합니다di2=1
Amit

가정은 의 초기 값을 "충분히 근접한"올바른 값 으로 얻는 것 입니다. 더 나은 추측이 있다면 그것부터 시작하십시오. d가 0보다 크면 설정할 수도 있습니다 . d는 반복에서 1로 가정되지 않고 단지 알고리즘을 시작합니다. λ ( 0 ) = 0λ(0)λ(0)=0
chanceislogic

(+1) 어쨌든 같은 수치 솔루션을 제공 할 것입니다.
Dmitrij Celov

6

다음은 chanceislogic에 의해 입증 된 공식을 기반으로하는 작은 Matlab 코드입니다.

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
팀을가요!
probabilityislogic

시도 된 편집자는 while 조건이이어야한다고 주장합니다 while ( abs(diff)>threshold ).
gung-모니 티 복원

@Amit이 게시 한 코드에 대한 대안 답변으로 이것을 게시하고 있습니다. while( abs(diff) > threshold )차이에 대한 허용 오차는 왼쪽과 오른쪽 모두에서 도달 할 수 있어야하기 때문에 임계 값과 비교하는 것이 좋습니다. 예를 들어 diff = 및 threshold = 하면 루프 조건이 거짓이지만 솔루션이 수렴되지 않은 것은 분명합니다. 1 e 161001e16
heuristicwondering
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.