Вычисление ковариационной матрицы в Matlab

я реализую алгоритм PCA в MATLAB. Я вижу два разных подхода к вычислению ковариационной матрицы:

C = sampleMat.' * sampleMat ./ nSamples;

и

C = cov(data);

в чем разница между этими двумя методами?

PS 1: когда я использую cov(data) это лишнее:

meanSample = mean(data,1);
data = data - repmat(data, nSamples, 1);

PS 2:

в первом подходе я должен использовать nSamples или nSamples - 1?

1 ответов


короче: cov в основном просто добавляет удобство в голые формулы.

если ты типа

edit cov

вы увидите много вещей, с этими строками полностью внизу:

xc = bsxfun(@minus,x,sum(x,1)/m);  % Remove mean    
if flag
    xy = (xc' * xc) / m;
else
    xy = (xc' * xc) / (m-1);  % DEFAULT 
end

что по сути совпадает с вашей первой строкой, за исключением вычитания столбца-означает.

читать Вики на образцах ковариаций, чтобы узнать, почему в пути по умолчанию есть минус один.

обратите внимание, однако, что ваша первая строка использует обычную транспонирование (.'), а cov - версия использует conjugate-transpose ('). Это сделает вывод cov отличается в контексте данных со сложными значениями.

также обратите внимание, что cov является вызовом функции для не встроенной функции. Это означает, что при использовании cov в цикле; JIT-компилятор Matlab не может ускорить не встроенные функции.