Bối rối bởi việc thực hiện sườn núi của MATLAB


8

Tôi có hai triển khai khác nhau ridgetrong MATLAB. Một là đơn giản

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

    (như đã thấy trên trang hồi quy sườn của Wikipedia ), với I là ma trận danh tính của các cột kích thước ( A ) × cột ( A ) và

  2. Tôi chỉ đơn giản gọi "sườn núi" của Matlab với

    x = ridge(A, b, lambda)

Vấn đề của tôi là cả hai trả về kết quả khác nhau. (1) trả về kết quả mà tôi muốn (tôi biết điều này bằng cách so sánh kết quả với người khác) nhưng tại sao (2) không trả lại kết quả tương tự?

Ma trận của tôi A rất thưa thớt, nó chứa đầy 1% 1 và 99% 0. Một số cột chứa gần như không có 1. Sự khác biệt lớn nhất dường như là hệ số cho các cột có rất ít 1 rất gần với 0 in (1), nhưng có thể khá xa so với 0 in (2)

Có ai có ý tưởng tại sao nó khác và làm thế nào tôi có thể sửa đổi cuộc gọi trong (2) để cho kết quả giống như (1) không?


4
Tôi đoán : Bạn đang tính toán (1) trên một uncenteredchưa định tỷ lệ ma trận, trong khi cuộc gọi đến ridge(theo tài liệu MATLAB) chỉ ra rằng (như là tiêu chuẩn): Theo mặc định, b được tính sau khi định tâm và mở rộng quy mô các dự đoán có ý nghĩa 0 và độ lệch chuẩn 1. Mô hình không bao gồm số hạng không đổi và X không được chứa cột 1s. .
Đức hồng y

Nếu định tâm và chia tỷ lệ là lý do, tôi có thể sửa đổi "A" và "b" để lệnh gọi Matlab cho kết quả giống như (1) không?
Susie G.

1
Xin chào, Susie. Có bạn có thể. Đầu tiên nếu có một cột không đổi (không khác) trong , hãy xóa nó. Bây giờ, chỉ cần trung tâm và chia tỷ lệ trước khi thực hiện cuộc gọi đến . Bạn không cần phải làm gì với . AAridgeb
Đức hồng y

(Tôi đã bỏ qua chi tiết về thưa thớt Khi tập trung, các thưa thớt sẽ bị phá vỡ Ví rất lớn.. này có thể giới thiệu các vấn đề tính toán.)A
hồng y

Câu trả lời:


6

Đây là một chương trình MATLAB để xác nhận những gì hồng y đã nói, nó thực sự là do định tâm và nhân rộng

% 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 thì bằng x2


0

Bạn nên chuyên quy mô trong sườn núi là 0, vì vậy nó trông giống như x = sườn núi (A, b, lambda, 0). Trong trường hợp này, hàng đầu tiên của x là hằng số và phần còn lại là các hệ số. Nói cách khác, x (2: end, :) phải là kết quả giống như bạn nhận được bằng cách sử dụng (1). Điều này được nêu rõ trong tài liệu mathlab. Hy vọng điều này sẽ giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.