2016-05-25 3 views
0

Il existe un théorème mathématique indiquant qu'une matrice A multipliée par sa transposée donne une matrice définie positive symétrique (conduisant ainsi à des valeurs propres positives). Pourquoi le test de symétrie échoue-t-il ici pour les matrices aléatoires de taille moyenne? Il travaille toujours pour les petites matrices (20,20 etc.)Symétrie de la matrice d'autocovariance par multiplication de la matrice de caractéristiques avec sa transposition

import numpy as np 
features = np.random.random((50,70)) 
autocovar = np.dot(np.transpose(features),features) 
print((np.transpose(autocovar) == autocovar).all()) 

je reçois toujours 'faux' d'exécuter ce code. Qu'est-ce que je fais de mal? J'ai besoin de la matrice d'autocovariance pour effectuer une PCA mais jusqu'à présent j'ai des valeurs propres complexes ...

Merci!

Répondre

0

Ceci peut être dû à des erreurs dans l'arithmétique en virgule flottante. Votre matrice peut être très proche d'une matrice symétrique numériquement, mais en raison d'erreurs dans l'arithmétique de précision finie, elle est techniquement non symétrique. Par conséquent, un solveur numérique peut renvoyer des valeurs propres complexes. Une solution (sorte de piratage) consiste à symétriser la matrice, c'est-à-dire à la remplacer par symmetric part. Cette matrice est garantie d'être symétrique, même en arithmétique à virgule flottante, et sera très proche de la matrice que vous définissez (précision proche de la machine). Cela peut être réalisé via

autocovar_sym = .5*(autocovar+autocovar.T) 

Espérons que cela aide.

+0

Merci beaucoup! Cela fonctionne parfaitement. En attendant, j'ai eu l'idée d'utiliser: 'autocovar = np.round (np.dot (np.transpose (caractéristiques), caractéristiques), 3)' qui donne le même résultat. Merci! – dopexxx

+0

Pas de problème! J'ai essayé votre code et ça passe votre test de symétrie. Mais c'est ** beaucoup ** plus loin de la matrice initiale, donc je ferais attention. Pour être plus précis, si 'X' est la matrice originale, non symétrique mais numériquement symétrique,' X1' est défini comme dans ma réponse et 'X2' comme dans votre réponse,' np.linalg.norm (X-X1, 'f ') 'et' np.linalg.norm (X-X2,' fro ') 'sont très différents. Le premier est précis à environ 12 chiffres, tandis que le dernier obtient à peine un seul chiffre. Juste un avertissement. –

+0

Merci de m'avoir laissé faire ça, je suis tout à fait nouveau pour Python et Machine Learning! :) – dopexxx