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