2011-10-20 3 views

Répondre

4

En supposant que chaque colonne est un échantillon (à savoir, il n échantillons chacun de dimension m), et il est stocké dans une matrice A vous devez d'abord soustraire de la colonne signifie:

 Amm = bsxfun(@minus,A,mean(A,2)); 

vous veulent faire une décomposition en valeurs propres sur 1/size(Amm,2)*Amm*Amm' (vous pouvez utiliser 1/(size(Amm,2)-1) comme un facteur d'échelle si vous voulez un interpetation comme une matrice de covariance non biaisée) avec:

 [v,d] = eig(1/size(Amm,2)*Amm*Amm'); 

Et la co Lumns de v vont être vos vecteurs PCA. Les entrées de d vont être vos "variances" correspondantes.

Toutefois, si votre m est énorme, ce n'est pas la meilleure façon de procéder, car stocker Amm*Amm' n'est pas pratique. Vous voulez calculer la place:

 [u,s,v] = svd(1/sqrt(size(Amm,2))*Amm,'econ'); 

Cette fois u contient vos vecteurs de PCA. Les entrées de s sont liées aux entrées de d par un sqrt.

Note: il y a une autre façon d'aller si m est énorme, à savoir l'informatique eig(1/size(Amm,2)*Amm '*Amm); (notez le commutateur de transposés par rapport ci-dessus) et faire un peu de ruse, mais il est une explication plus je ne vais pas entrer.

+0

Brille éclatante et explications +1! –

Questions connexes