IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

ACP: vecteurs propres et changement de repères


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 55
    Points : 37
    Points
    37
    Par défaut ACP: vecteurs propres et changement de repères
    Bonjour,

    Je vous écris pour vous poser deux questions qui concerne la méthode ACP.

    La première sur le calcul des vecteurs propres d'une matrice de covariance avec la libraire Numpy de Python. J'ai vu qu'il y a les fonctions eig et eigh mais que celles ci peuvent retourner des vecteurs propres ayant des valeurs complexes.
    La matrice de covariance étant symétrique, j'ai lu qu'elle n'aura que des valeurs propres réelles, et que pour chacune des valeurs propres il peut y avoir un vecteur propre complexe, mais qu'il y a forcément un vecteur propre réel.
    Ma question est donc: il y a-t-il un moyen de préciser avec les fonctions eig et eigh (ou d'autres de NumPy) que l'on ne veut que des vecteurs propres réels?
    Si ce n'est pas possible, peut-on obtenir le vecteur propre réel à partir d'un vecteur propre complexe (faut-il prendre la partie réelle d'un nombre complexe?).


    2) J'utilise l'ACP comme prétraitement des données (des images de dimension nxn) pour un systeme de classification supervisee. On peut représenter une image comme un vecteur a n² dimensions où chaque composante a pour valeur l'intensité du pixel.
    Avec l'ACP utilisé sur mes données, j'obtiens un ensemble de données dans p dimensions (p <= n).
    Lorsqu'une nouvelle image (hors de l'échantilon d'apprentissage) est à classifier, il faut d'abord la convertir dans le nouveau repère crée (celui des vecteurs propres choisis).
    Connaissaez vous la méthode pour convertir une image a n dimensions dans le nouveau repère a p dimensions?
    (Je pense que l'on peut commencer par supprimer les valeurs des dimensions non utilisées dans notre repère mais après je ne sais pas.)

    En vous remerciant

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    je ne connais pas les fonctions numpy en question, mais:
    - A priori, les vecteurs propres d'une matrice symétrique positive sont réels.
    - il existe plusieurs possibilités pour le filtrage, mais la plus simple est d'exprimer ton nouveau vecteur dans la base de diago, et de laisser tomber les coordonnées des vecteurs propres que tu juges non significatifs. Ce changement de base peut se faire par une simple multiplication matricielle (la matrice de changement de base est fournie en sortie de l'ACP, c'est la matrice des vecteurs propres).

    Attention, tu passes la dimension n^2 (et non n) à la dimension p

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Sinon autre moyen pour la projection (utilise à priori des calculs inutiles) : la coordonnées de V sur l'axe k est à une constante près cov(V,F_k)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Merci de votre réponse.

    J'ai lu quelques notes sur les changements de base, et j'ai lu que:
    - pour Img le vecteur colonne contenant les n² valeurs de mon image dans la base d'origine (nxn).
    - P la matrice où chaque colonne est un vecteur propre selectionné par l'ACP (les vecteurs propres non importants ont été enlevés). Il y a donc p colonnes dans la matrice P et chaque vecteur a n² composantes
    Je crois que puisque les vecteurs propres sont orthogonaux alors les vecteurs propres sont orthogonaux entre eux.

    Donc ImgP (les coordonnees de l'image dans la base des vecteurs propres)
    est tel que ImgP= P^(-1) * Img avec P^(-1) l'inverse de la matrice P.

    Est-ce que ce calcul pour trouver la valeur de l'image dans la nouvelle base (celle des vecteurs propres) vous semble-t-il juste?

    Merci encore

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Salut,

    Tout d'abord, je te coneil (si c'est possible) d'utiliser la fonction eigh du module scipy.linalg à la place de celui de numpy car elle a l'avantage de retourner les valeur propre ordonnées et tu peux ne calculer que celles dont tu as besoin.

    En imaginant que 'imgs' contient toutes tes images sous forms d'un tableau
    nimgs x n x n.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nimgs = imgs.shape[0]
    n = imgs.shape[1]
     
    imgVec = imgs.reshape(nimgs,n*n)
    cov = np.cov(ImgVec.T)
    w,u = eigh(cov,eigvals = (n*n-p,n*n-1)) # récupère les p plus grandes valeurs propres.
    imgP = np.dot(imgVec - imgVec.mean(0),u) # projecte les images sur la nouvelle base
    Pour projeter les images dans la nouvelle base il suffit d'utiliser la matrices des vecteur propres comme matrice de projection. Si tu veux "blanchir" tes coordonées, c'est à dire donner la même importance à tous les axes dans la nouvelle base tu peux également diviser par la racine carrée des valeurs propres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imgP = np.dot(imgVec - imgVec.mean(0),u/np.sqrt(w))

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    merci de votre réponse.
    Pour mon projet je ne peux utiliser que numpy mais merci pour votre aide, je vais m'en inspirer.

Discussions similaires

  1. Calcul des valeurs et vecteurs propres de l'ACP
    Par amine31000 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 08/08/2012, 19h52
  2. changement de repère d'un vecteur
    Par Xfennec dans le forum Mathématiques
    Réponses: 10
    Dernier message: 28/07/2009, 23h24
  3. valeurs propres d'une matrice et vecteurs propres
    Par la_fantomas dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/05/2005, 15h35
  4. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo