2014-06-09 5 views
0

J'essaie de trouver des valeurs propres/vecteurs propres pour de grands ensembles de données afin de calculer la PCA. Je peux calculer les valeurs propres et vecteurs propres pour 2x2, 3x3 etc ..Valeurs propres de Matlab

Le problème est, j'ai un ensemble de données contenant 451x128 je calcule la matrice de covariance qui me donne 128x128 les valeurs de cette situation. Cela ressemble donc à ce qui suit:

A = [ [1, 2, 3, 
     2, 3, 1, 
     .........., 
     = 128] 
     [5, 4, 1, 
     3, 2, 1, 
     2, 1, 2, 
     .......... 
     = 128] 
     ......., 
     128] 

Le calcul des valeurs propres et des vecteurs pour un vecteur 128x128 semble vraiment difficile et prendrait beaucoup de puissance de calcul. Cependant, si je permets que chacun des blocs dans A soit bidimensionnel (3xN), je peux alors calculer la matrice de covariance qui me donnera une matrice 3x3.

Ma question est la suivante: Serait-ce une hypothèse bonne ou raisonnable pour résoudre les valeurs propres et les vecteurs? Quelque chose comme ceci:

A est un vecteur de dimension 2 contenant 128x451, foreach des blocs calculer les valeurs propres et les vecteurs propres du vecteur de covariance, comme ceci:

Eig1 = EIG (cov (A [0])) Eig2 = EIG (cov (A [1]))

Ce serait alors me donner 128 (pour Eigenvalues ​​chacun des blocs à l'intérieur du 128x128 vect ou)

Si cela n'est pas correct, comment MATLAB gère-t-il ces grandes données dimensionnelles?

+0

Que voulez-vous dire par "Si ce n'est pas correct"? Et MATLAB peut trouver des vecteurs propres et des valeurs propres de grandes matrices carrées en une fraction de seconde. –

+0

@AdarshChavakula Hey, j'essaye de créer un algorithme (en C++) qui peut calculer les valeurs propres et les vecteurs propres sans utiliser de logiciel tiers .. Je peux, calculer un '2x2',' 3x3' mais je suis confus sur la façon de le calculer pour les grandes matrices carrées. Je ne comprends pas très bien comment matlab le fait - Est-ce que cela a du sens? – Phorce

Répondre

-3

Utilisez le mot

[Eigenvectors, Eigenvalues] = eig(Matrix) 
0

Avez-vous essayé svd()

faire la décomposition de valeurs singulières

[U,S,V] = svd(X) 

U et V sont des matrices orthogonales et S contient les valeurs propres. Triez U et V dans l'ordre décroissant sur la base de S.

+0

mon mauvais je pense que la question est confuse – Phorce

+0

Que voulez-vous dire par confusion? btw, 'svd' pour un 451x128 est assez rapide, je pense. – kkuilla

0

Comme kkuilla mentionne, vous pouvez utiliser la SVD de la matrice d'origine, comme la SVD d'une matrice est liée aux valeurs propres et vecteurs propres de la matrice de covariance comme je démontrerai dans l'exemple suivant:

A = [1 2 3; 6 5 4]; % A rectangular matrix 
X = A*A';    % The covariance matrix of A 

[V, D] = eig(X);  % Get the eigenvectors and eigenvalues of the covariance matrix 
[U,S,W] = svd(A);  % Get the singular values of the original matrix 

V est une matrice contenant les vecteurs propres, et D contient les valeurs propres. Maintenant, la relation:

SS T ~ D

U ~ V

Quant à votre propre hypothèse, je peut être une mauvaise interprétation, mais je pense qu'il est faux.Je ne vois pas pourquoi les valeurs propres des blocs se rapporteraient aux valeurs propres de la matrice dans son ensemble; ils ne correspondraient pas aux mêmes vecteurs propres, car la dimensionnalité des vecteurs propres ne correspondrait pas. Je pense que vos covariances seraient différentes aussi, mais je ne suis pas tout à fait clair sur la façon dont vous créez ces blocs.

Pour ce qui est de Matlab, il utilise certaines astuces. Peut-être que le lien ci-dessous pourrait être informatif (bien qu'il pourrait être un peu vieux). Je crois qu'ils utilisent (ou utilisent) LAPACK et une factorisation QZ pour obtenir des valeurs intermédiaires.

https://au.mathworks.com/company/newsletters/articles/matlab-incorporates-lapack.html

Questions connexes