Предполагая, что каждый столбец является выборкой (то есть, у вас есть n
выборок, каждая из которых имеет размер m
), и он хранится в матрице A
. Сначала вы должны вычесть значение столбца:
Amm = bsxfun(@minus,A,mean(A,2));
затем вы хотите выполнить декомпозицию по собственным значениям на 1/size(Amm,2)*Amm*Amm'
(вы можете использовать 1/(size(Amm,2)-1)
в качестве масштабного коэффициента, если вы хотите интерпретацию в качестве несмещенной ковариационной матрицы) с:
[v,d] = eig(1/size(Amm,2)*Amm*Amm');
И столбцы v
будут вашими векторами PCA. Записи в d
будут вашими соответствующими "отклонениями".
Однако, если ваш m
огромен, тогда это не лучший способ, потому что хранение Amm*Amm'
нецелесообразно. Вместо этого вы хотите вычислить:
[u,s,v] = svd(1/sqrt(size(Amm,2))*Amm,'econ');
На этот раз u
содержит ваши векторы PCA. Записи s
связаны с записями d
на sqrt
.
Примечание: есть и другой способ, если m
огромен, то есть вычисление eig(1/size(Amm,2)*Amm
'*Amm);
(обратите внимание на переключение транспозиций по сравнению с приведенным выше) и выполнение небольшой хитрости, но это более длинное объяснение, поэтому я не буду получать в него.