2016-06-09 4 views
0

Ближайший матч я могу получить это запустить:Разница в результатах Matlab при использовании PCA() и PCACOV()

data=rand(100,10); % data set 
    [W,pc] = pca(cov(data)); 

тогда не унижать

data2=data 
    [W2, EvalueMatrix2] = eig(cov(data2)); 
    [W3, EvalueMatrix3] = svd(cov(data2)); 

В этом случае W2 и W3 согласны и W является их транспонированием?

По-прежнему непонятно, почему W должен быть транспонирован для двух других?

В качестве дополнительной проверки я использую pcacov:

[W4, EvalueMatrix4] = pcacov(cov(data2)); 

Опять согласен с WE и W3, но это транспонированная W?

+3

Возможно, 'pca' вычисляет собственные векторы ковариационной матрицы? [http://math.stackexchange.com/questions/3869/what-is-the-intuitive-relationship-between-svd-and-pca](http://math.stackexchange.com/questions/3869/what- is-the-intuitive-relationship-between-svd-and-pca) – shamalaia

+0

Вы пытались использовать 'eig' или' svd'? – Dan

+0

В приведенной выше ссылке говорится, что pca центрирует данные и использует svd (так что можно ожидать каких-либо отличий от результата pca, но эти результаты совершенно разные?). В нем также говорится, что вход должен состоять из матрицы n * p, где n - наблюдение, а p - переменные, которые не предполагают использование ковариационной матрицы? – Bazman

ответ

2

Результаты разные, потому что вы вычитаете среднее значение для каждой строки матрицы данных. Основываясь на том, как вы вычисляете вещи, строки матрицы данных соответствуют точкам данных и столбцам, соответствующим размерам (так работает функция pca()). С помощью этой настройки вы должны вычесть среднее значение из каждого столбца, а не строки. Это соответствует «центрированию» данных; среднее по каждому измерению равно нулю. Как только вы это сделаете, результаты должны быть эквивалентны pca(), до подписи флип.

Редактировать на адрес, отредактированный пользователь: Проблема с центрированием выглядит нормально. Когда вы запускаете разложение на собственные значения в матрице ковариации, не забудьте отсортировать собственные векторы в порядке убывающих собственных значений. Это должно соответствовать выходу pcacov(). При вызове pca() вы должны передать ему матрицу данных, а не ковариационную матрицу.

+0

Я понимаю, что это стало захламленным, поэтому я упростил. Мне все еще кажется странным, что pca (cov (data)) и pcacpv (cov (data)) должны быть разными. – Bazman

+0

Отредактирован ответ для решения этой проблемы. – user20160

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