Verwirrt durch MATLABs Implementierung von Ridge


8

Ich habe zwei verschiedene Implementierungen von ridgein MATLAB. Eins ist einfach

  1. x=(AA+Iλ)1Ab

    (wie auf der Grat-Regressionsseite von Wikipedia zu sehen ), wobei die Identitätsmatrix der Größenspalten ( ) Spalten ( ) ist undA × A.IA×A

  2. Ich nenne Matlab einfach "Grat" mit

    x = ridge(A, b, lambda)

Mein Problem ist, dass beide unterschiedliche Ergebnisse liefern. (1) gibt die gewünschten Ergebnisse zurück (ich weiß das, indem ich die Ergebnisse mit anderen Personen vergleiche), aber warum gibt (2) nicht dieselben Ergebnisse zurück?

Meine Matrix ist spärlich, sie ist mit 1% 1 und 99% 0 gefüllt. Einige Spalten enthalten fast keine Einsen. Der größte Unterschied scheint zu sein, dass der Koeffizient für Spalten mit sehr wenigen Einsen sehr nahe bei 0 in (1) liegt, aber ziemlich weit von 0 in (2) entfernt sein kann.A

Hat jemand eine Idee, warum es anders ist und wie ich den Aufruf in (2) ändern kann, um die gleichen Ergebnisse wie in (1) zu erzielen?


4
Meine Vermutung : Sie berechnen (1) auf einer nicht zentrierten und nicht skalierten Matrix, während der Aufruf von ridge(gemäß MATLAB-Dokumentation) Folgendes anzeigt (standardmäßig): Standardmäßig wird b berechnet, nachdem die Prädiktoren zentriert und skaliert wurden, um einen Mittelwert zu erhalten 0 und Standardabweichung 1. Das Modell enthält keinen konstanten Term, und X sollte keine Spalte von 1s enthalten. .
Kardinal

Wenn die Zentrierung und Skalierung der Grund ist, kann ich "A" und "b" so ändern, dass der Matlab-Aufruf das gleiche Ergebnis wie (1) liefert?
Susie G.

1
Hallo Susie. Ja, du kannst. Wenn in Spalte mit allen Konstanten (ungleich Null) vorhanden ist , entfernen Sie diese zunächst. Zentrieren und skalieren Sie jetzt einfach selbst, bevor Sie den Anruf tätigen . Sie sollten nichts mit tun müssen . A bAAridgeb
Kardinal

(Ich habe Details der Sparsity ignoriert. Beim Zentrieren wird die Sparsity gebrochen. Für sehr große kann dies rechnerische Probleme verursachen.)A
Kardinal

Antworten:


6

Dies ist ein Matlab-Programm, um zu überprüfen, was der Kardinal gesagt hat. Es liegt tatsächlich an der Zentrierung und Skalierung

% Create A(10 by 3 matrix) and b(10 by 1 matrix)
A=rand(10,3);
b=rand(10,1);
lambda=0.01
% centering and scaling A 
s=std(A,0,1);
s=repmat(s,10,1);
A=(A-repmat(mean(A),10,1))./s;

%check the result
X1=inv(A'*A+eye(3)*lambda)*A'*b;
X2=ridge(b,A,lambda,1);

x1 ist dann gleich x2


0

Sie sollten die Skala in Grat als 0 spezialisieren, damit sie wie x = Grat (A, b, Lambda, 0) aussieht. In diesem Fall ist die erste Reihe von x konstant und der Rest sind die Koeffizienten. Mit anderen Worten, x (2: end, :) sollte das gleiche Ergebnis sein, das Sie mit (1) erhalten haben. Dies ist in der Mathlab-Dokumentation klar angegeben. Ich hoffe, das hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.