2014-02-02 2 views
0

У меня есть массив 75x60 в Matlab. Я пытаюсь сделать PCA. Я пытаюсь проверить свою работу, убедившись, что наибольшее собственное значение, возвращаемое eig (matrix), возвращает то же самое, что и d (1) * d (1) в [u d v] = svd (matrix). Они безумно ушли. Единственное, что я вижу, что может пойти не так, - это унижение.Как унизить данные для PCA

Вот как я обработки унизительно:

%v is a 75x60 array 
%rowS is 75 
avgVector= mean(v,1); 
muMatrix = repmat(avgVector,rowS,1); 
v = v-muMatrix; 

Если бы я называть СВД (v) он будет возвращать очень разные значения, чем EiG (СОУ (v)), то ли претерпело v выше унижения или нет.

ответ

2

Если матрицы следовать стандартной Matlab конвенции, что переменные являются столбцы и образцы строк, то ваш подход, в основном

v = v - repmat(mean(v, 1), size(v, 1), 1); 

правильно. Было бы больше памяти эффективным, хотя и не взрывать средства для полноразмерной матрицы:

v = bsxfun(@minus, v, mean(v, 1)); 

Там также возможность использовать

v = detrend(v, 'constant') 

, который внутренне использует предыдущий код.


Проблема лежит где-то другое: singular values из v являются квадратные корни из собственных v'*v. Если v является условно-свободным, то v'*v (в данном случае называемый «матрицей рассеяния») идентичен ковариационной матрице (несмещенной оценки) cov(v) - до коэффициентаsize(v, 1) - 1. Если вы используете код

[V, D] = eig(cov(v)); 
[U, S, V] = svd(bsxfun(@minus, v, mean(v, 1))); 

вы обнаружите, что

sort(diag(D), 'descend') 

и

diag(S) .^ 2/(size(x, 1) - 1) 

идентичны до ошибок округления. Дополнительный sort необходим, потому что eig не гарантирует заказные собственные значения.