Вычисление ковариационной матрицы в 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 не может ускорить не встроенные функции.