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 :

ANALYSE EN COMPOSANTES PRINCIPALES


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut ANALYSE EN COMPOSANTES PRINCIPALES
    Bonjour

    je suis débutante en python et aussi c'est la premiere fois que je fais l'acp nous n'avons pas fais ça en cours je veux réaliser une acp sur une base de données mais je comprend pas comment faire je sais que je dois utiliser la bibliothéque scikit-learn mais le soucis que je comprend pas comment je peux choisir le nombre de composantes

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il faut commencer par lire la documentation, le guide utilisateur et les exemples associés.
    Normalement, les exemples sont orientés "cas d'utilisation": vous en cherchez un qui est similaire à vos traitements et vous essayez de l'adapter.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Merci pour les documents moi je cherche à avoir la représentation des variables sur un plan est ce que vous avez un exemple ??

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Je pense qu'avant de se lancer dans l'utilisation de scikit learn, un tuto simple à reproduire serait pas mal. Je trouve celui-ci assez clair. En utilisant des outils simples de numpy on peut reproduire entièrement le tuto pas à pas. Puis le refaire en utilisant directement sklearn.decomposition.PCA. De cette façon on comprend mieux ce que fait cette grosse boite noire et plus important encore on est sûr de bien l'utiliser.

    Je ne sais pas vraiment comment choisir le nombre de composantes, si ce n'est en faisant des tests. Si la quantité de données est conséquente, on peut toujours faire l'analyse sur un nombre restreint. Dans le tuto en lien, on voit que les composantes sont plus ou moins importantes en fonction de leur eigen value. Dans le cas de 5 variables, imaginons que 3 ont une valeur proche de 1 et 2 proches de 0.05 (nombres au hasard), alors il est assez simple de supposer que les 3 plus fortes composantes suffiront.. Un test sera toujours nécessaire pour valider ou non l'hypothèse.

    J

  5. #5
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Merci pour les information je vais suivre ce que vous me dites

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Je ne sais pas vraiment comment choisir le nombre de composantes, si ce n'est en faisant des tests. Si la quantité de données est conséquente, on peut toujours faire l'analyse sur un nombre restreint. Dans le tuto en lien, on voit que les composantes sont plus ou moins importantes en fonction de leur eigen value.
    Ca permet juste de construire un modèle "simple" à partir d'un jeu de données bien choisies.
    La difficulté étant que "bien choisir" les données et savoir à quoi doit ressembler le modèle demande un savoir faire "métier". La plupart des exemples sont assez bons pour montrer comment utiliser l'outil numérique mais très superficiels sur la partie "métier": si on a un problème qui sort des exemples données, on va ramer comme une bête pour produire des résultats possiblement dangereux (un modèle qui marche sans correspondre aux réalités).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    J'ai lu la documentation que vous m'avez donné j'ai réussit à écrire ce petite code est ce que j'ai bien fais ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #####        importation des bibliothéques          #####
    import pickle
    import numpy as np 
    import matplotlib.pyplot as plt
    from scipy import stats
    import os
    os.sys.path.append('/home1/homedir6/perso/oarcher/prog/python')
    from utils.struct import filter_data
    import seaborn as sns 
    sns.set(context="paper",font="monospace")
    import pdb
    from sklearn.preprocessing import StandardScaler
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    from sklearn.feature_selection import VarianceThreshold
    from sklearn.decomposition import PCA
     
     
     
    #####       importation de données   #####
     
    data=pickle.load(open("test.pkl","rb"))
     
    mesures_names_sec = [ 'Var1','Var2','Var3']
     
    l=np.zeros((len(data['Var1']),len(mesures_names_sec)))
    for i in range(len(mesures_names_sec)):
        for j in range(len(data['Var1'])):
           l[j][i]= data[mesures_names_sec[i]][j]
     
     
    l_new=np.zeros((len(data['Var1']),len(mesures_names_sec)))
    for i in range(len(mesures_names_sec)):
        m=np.mean(data[mesures_names_sec[i]],0)
        v=np.std(data[mesures_names_sec[i]],0)
        for j in range(len(data['Var1'])):
           l_new[j][i]= ((data[mesures_names_sec[i]][j]-m)/v)
     
     
    pca = PCA(n_components=None)
    l_r=pca.fit(l_new)
    print (pca.explained_variance_ratio_)
    plt.plot(pca.explained_variance_ratio_)
    plt.show()

  8. #8
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Bonjour

    Voici le fichier test.xlsx je veux expliquer la variable 1 avec les 3 autres variables test.xlsx

  9. #9
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Pas évident à expliquer quand pour moi-même les choses ne sont pas tout à fait claires... Mais essayons. Si je comprends bien, on a une grandeur (V1) liée à 3 variables (V2, V3 et V4) et vous cherchez un lien entre en V1 et les trois autres variables. Si vous avez choisi de passer par une analyse ACP c'est que vous souhaitez réduire la dimension du problème.

    Le principe de l'ACP c'est de déterminer les vecteurs propres du système qui constituent un système orthogonal dans lequel sont définies les variables. Qui dit orthogonal, dit indépendants. Imaginons le cas 2D. On a x et y, deux variables. Un nuage de points dans ce repère. On peut trouver deux axes, notés ev1 et ev2 (pour "eigen vector") orthogonaux formant un nouveau repère dans lequel les mêmes points sont définissable. Bien. Si admettons le nuage de points est très proche de former une droite un peu bruitée, alors dans le nouveau repère (ev1,ev2) ces points seront très proches d'un seul des deux axes. Cet axe est le vecteur propre avec la plus grande valeur propre (eigen value), c'est l'axe principal, c'est l'axe pour lequel la variance est la plus grande. On peut donc simplifier le problème en considérant que les points sont tous sur cet axe (enlever le vecteur propre avec la plus faible énergie). On est dans l'exemple donné le tuto fourni plus haut.

    Maintenant supposons que l'on ai une troisième grandeur notée z qui dépend de x et de y. Cette grandeur z est liée par une loi inconnue à x et y. On peut alors tenté d'exprimé z en fonction de ev1 et ev2 à la place de x et y. Si on imagine que l'axe ev1 a beaucoup plus d'énergie que l'axe ev2 (c'est ce que fourni pca.explained_variance_ratio_ au passage, voir doc), alors on néglige ev2 et on exprime uniquement z en fonction de ev1. C'est d'un coup plus facile.
    MAIS au final z dépend toujours de x ET y. Une fois qu'on a exprimé z en fonction de ev1, on fait le travail inverse: on exprime ev1 en en fonction de x et y, et donc en fonction de x et y.

    Bon... dur sans graph pour support.

    Dans votre cas, vous pouvez calculer les valeurs propres et vecteurs propres de la matrice formée de v2, v3 et v4. J'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [+] Eigenvalues
    [  2.07004300e+00   3.26751226e-02   7.55104049e-04]
     
    [+] Eigenvectors
    [[ 0.10444485  0.99213334 -0.06901234]
     [ 0.06514978  0.06241733  0.99592147]
     [-0.99239447  0.10851501  0.0581181 ]]
    Les colonnes de la matrice eigenvectors sont les axes principaux (que l'on peut nommés ev1, ev2 et ev3). Je peux pas trancher comme ça, mais on dirait bien que ev3 soit pas très important (valeur propre de 7.55104049e-04 comparée à 2.07004300e+00 pour ev1). On pourrait donc se contenter d'exprimer v1 en fonction de ev1 et ev2.


    Ju

  10. #10
    Membre du Club
    Femme Profil pro
    Ergonome
    Inscrit en
    Février 2016
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Février 2016
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Moi ce que je comprend pas c'est que après avoir choisi les composantes principales comment on peut revenir à nos variables , moi je cherche en fait surtout de dessiner la représentation des variables dans un plan merci pour votre réponse

  11. #11
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Et bien une fois la matrice formée des vecteurs propres rangés dans l'ordre décroissant de valeur propre ([ev1, ev2, ev3], avec evi des vecteurs colonnes) que l'on peut nommé components, on peut "compresser" les données initiales dans le repère formé de (ev1, ev2, ev3) comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compressed_data = np.dot(init_data, components)
    Bon, là on ne fait pas grand chose. Mais si on veut réduire le problème à uniquement à 1 dimension, on dit que components = [ev1] et on fait pareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compressed_data = np.dot(init_data, components)
    Pour revenir dans le repère initial (v2,v3,v4) il suffit de faire un faire un simple calcul matriciel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    projected_data = np.dot(np.dot(compressed_data, components.T))
    Attention à bien enlever la valeur moyenne pour chaque variable avant la "compression" (désolé pour le terme, je ne connais pas la vrai appellation), puis de rajouter la moyenne à la fin. Les donnés projetées seront toujours en fonction de v2, v3 et v4.

    Pour visualiser sur un plan, la seule façon c'est de conserver qu'une seule composante et de tracer v1 en fonction de cette dernière. Mais si l'objectif c'est de trouver une loi reliant v1 à v2, v3 et v4, alors il suffit d'exprimer v1 en fonction de ev1, puis ev1 en fonction de v2, v3, v4:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Analyse en composantes principales en Java
    Par jmini dans le forum Langage
    Réponses: 4
    Dernier message: 01/12/2014, 17h03
  2. analyse par composante principale
    Par takfa2008 dans le forum Méthodes exploratoires
    Réponses: 4
    Dernier message: 30/03/2009, 13h58
  3. [Débutante] Analyse en composantes principales
    Par cixidetroy dans le forum MATLAB
    Réponses: 3
    Dernier message: 16/06/2008, 14h33
  4. Analyse en composantes principales
    Par afnane dans le forum Méthodes exploratoires
    Réponses: 1
    Dernier message: 12/06/2008, 15h25
  5. Analyse en composante principale
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/03/2007, 13h26

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