Bingung dengan implementasi ridge MATLAB

8

Saya memiliki dua implementasi berbeda ridgedi MATLAB. Hanya satu

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

    (seperti yang terlihat di halaman regresi ridge Wikipedia ), denganI menjadi matriks identitas kolom ukuran (A) × kolom (A), dan

  2. Saya hanya memanggil "punggungan" Matlab dengan

    x = ridge(A, b, lambda)

Masalah saya adalah keduanya menghasilkan hasil yang berbeda. (1) mengembalikan hasil yang saya inginkan (saya tahu ini dengan membandingkan hasil dengan orang lain) tetapi mengapa (2) tidak mengembalikan hasil yang sama?

Matriks saya Ajarang, diisi dengan 1% 1 dan 99% 0. Beberapa kolom mengandung hampir no 1. Perbedaan terbesar tampaknya adalah bahwa koefisien untuk kolom tersebut dengan sangat sedikit 1 sangat dekat dengan 0 in (1), tetapi bisa sangat jauh dari 0 in (2)

Adakah yang tahu mengapa ini berbeda dan bagaimana saya bisa memodifikasi panggilan di (2) untuk memberikan hasil yang sama seperti (1)?

Susie G.
sumber
4
Dugaan saya : Anda menghitung (1) pada uncentered dan unscaled matriks, sedangkan panggilan untuk ridge(sesuai dokumentasi MATLAB) menunjukkan bahwa (sebagai standar): Secara default, b dihitung setelah berpusat dan skala prediktor untuk memiliki mean 0 dan standar deviasi 1. Model tidak menyertakan suku konstanta, dan X tidak boleh berisi kolom 1s. .
kardinal
Jika pemusatan dan penskalaan adalah alasannya, dapatkah saya memodifikasi "A" dan "b" sehingga panggilan Matlab memberikan hasil yang sama seperti (1)?
Susie G.
1
Hai, Susie. Ya kamu bisa. Pertama jika ada kolom semua-konstan (bukan nol) diA, Singkirkan. Sekarang, cukup pusat dan skalaAdiri Anda sebelum melakukan panggilan ke ridge. Anda tidak perlu melakukan apa pun untuk melakukannyab.
kardinal
(Saya telah mengabaikan detail sparsity. Saat centering, sparsity akan rusak. Karena sangat besar Aini dapat menimbulkan masalah secara komputasi.)
kardinal

Jawaban:

6

Ini adalah program matlab untuk memvalidasi apa yang dikatakan kardinal, sebenarnya karena pemusatan dan penskalaan

% 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 maka sama dengan x2

pengguna2874944
sumber
0

Anda harus mengkhususkan skala pada ridge sebagai 0, sehingga terlihat seperti x = ridge (A, b, lambda, 0). Dalam hal ini, baris pertama x adalah konstan dan sisanya adalah koefisien. Dengan kata lain, x (2: end, :) harus hasil yang sama seperti yang Anda dapatkan dengan menggunakan (1). Ini jelas dinyatakan dalam dokumentasi mathlab. Semoga ini bisa membantu.

吴 京城
sumber