2016-02-27 7 views
4

Я попытался написать код Matlab, который бы разложил матрицу в ее форму SVD.Реализация SVD Matlab

«Теория»:

Чтобы получить U, я нашел собственные векторы АА», и получить V, я нашел собственные векторы А'А. Наконец, Sigma является матрицей той же размерности, что и A, с корнем собственных значений на диагонали в упорядоченной последовательности.

Однако, похоже, что это не работает должным образом. похоже, возвращается с коэффициентом -1

A=[2 4 1 3; 0 0 2 1]; 

% Get U, V 
[aatVecs, aatVals] = eig(A*A'); 
[~, aatPermutation] = sort(sum(aatVals), 'descend'); 
U = aatVecs(:, aatPermutation); 

[ataVecs, ataVals] = eig(A'*A); 
[~, ataPermutation] = sort(sum(ataVals), 'descend'); 
V = ataVecs(:, ataPermutation); 

% Get Sigma 
singularValues = sum(aatVals(:, aatPermutation)).^0.5; 
sigma=zeros(size(A)); 
for i=1:nnz(singularValues) 
    sigma(i, i) = singularValues(i); 
end 

A 
U*sigma*V' 

U * сигма * V»:

ans = 

-2.0000 -4.0000 -1.0000 -3.0000 
0.0000 0.0000 -2.0000 -1.0000 

Что ошибка в коде или„теории“, что привело к этому?

+0

Я писал об этом в мае прошлого года: [Расчет SVD вручную] (http://math.stackexchange.com/a/1805239/339790). –

ответ

5

Собственные векторы не являются уникальными (потому что Av==λv по определению, любой w с μw==v и μ~=0 также является собственным вектором). Так получилось, что собственные векторы, возвращаемые eig, не соответствуют правильному пути для SVD (даже если они нормализованы).

Однако мы можем построить U, если у нас есть V, который мы найдем в качестве собственных векторов A'*A, как в вашем алгоритме. Как только вы найдете V в отсортированных собственных векторах, вы должны найти U для соответствия. Так как V является ортогональным, A*V == U*sigma. Таким образом, мы можем установить

U = [A*V(:,1)./singularValues(1) A*V(:,2)./singularValues(2)]; 

и в самом деле, A == U*sigma*V', и в частности U здесь именно негатив U нашел с алгоритмом.

+0

Хотя собственные векторы не уникальны, нормированные собственные векторы должны быть, нет? –

+1

@AnaM Нет, потому что 'norm (v) == norm (-v)', а с 'n' собственных векторов у вас есть 2^n' комбинаций ортонормированных векторов. – zeeMonkeez

+0

Это решает. благодаря –

Смежные вопросы