Я задал этот вопрос на Math Stackexchange, но, похоже, ему не было уделено достаточно внимания, поэтому я задаю его здесь. https://math.stackexchange.com/questions/1729946/why-do-we-say-svd-can-handle-singular-matrx-when-doing-least-square-comparison?noredirect=1#comment3530971_1729946
Из некоторых руководств я узнал, что SVD должен быть более стабильным, чем разложение QR, при решении задачи наименьших квадратов, и он может обрабатывать сингулярную матрицу. Но следующий пример, который я написал в Matlab, похоже, подтверждает противоположный вывод. У меня нет глубокого понимания SVD, поэтому, если бы вы могли просмотреть мои вопросы в старом посте на Math StackExchange и объяснить мне это, я был бы очень признателен.
Я использую матрицу с большим числом условий (e+13). Результат показывает, что SVD получает гораздо большую ошибку (0,8), чем QR (e-27).
% we do a linear regression between Y and X
data= [
47.667483331 -122.1070832;
47.667483331001 -122.1070832
];
X = data(:,1);
Y = data(:,2);
X_1 = [ones(length(X),1),X];
%%
%SVD method
[U,D,V] = svd(X_1,'econ');
beta_svd = V*diag(1./diag(D))*U'*Y;
%% QR method(here one can also use "\" operator, which will get the same result as I tested. I just wrote down backward substitution to educate myself)
[Q,R] = qr(X_1)
%now do backward substitution
[nr nc] = size(R)
beta_qr=[]
Y_1 = Q'*Y
for i = nc:-1:1
s = Y_1(i)
for j = m:-1:i+1
s = s - R(i,j)*beta_qr(j)
end
beta_qr(i) = s/R(i,i)
end
svd_error = 0;
qr_error = 0;
for i=1:length(X)
svd_error = svd_error + (Y(i) - beta_svd(1) - beta_svd(2) * X(i))^2;
qr_error = qr_error + (Y(i) - beta_qr(1) - beta_qr(2) * X(i))^2;
end