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

Algorithmes et structures de données Discussion :

Supprimer des valeurs aberrantes dans un flux de données


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tuvalu

    Informations professionnelles :
    Activité : Geek débile créatif

    Informations forums :
    Inscription : Janvier 2017
    Messages : 23
    Par défaut Supprimer des valeurs aberrantes dans un flux de données
    Bonjour à tous,


    Je ne sais pas si je suis dans le bon forum (sinon merci de m'indiquer la voie !), mais je souhaite trouver un moyen de supprimer des valeurs aberrantes, pas dans un ensemble de données, mais dans un flux de données.

    Ce flux est généré par un régulateur PID, sous forme de signal dont je vous fais grâce des détails, mais qui fournit une valeur en % chaque seconde. Ces valeurs sont récupérées par un automate programmable, qui les exploite et peut en faire des calculs simples.

    Le problème à résoudre : le régulateur envoie des données entachées d'un certain "bruit", et fournit parfois des valeurs carrément aberrantes. Exemple ci-dessous :

    0,204253
    0,204353
    0,204057
    0,203862
    0,204146
    0,203241
    0,273856
    0,269893
    0,198947
    0,204200
    0,204540
    0,205390
    0,204444
    0,204188
    0,279051
    0,204530
    0,203454
    0,208714
    0,209387
    0,210538
    0,209179
    0,208428


    Je souhaite donc trouver un moyen (un algo en quelque sorte) de repérer ces valeurs et de les supprimer. J'ai fait un premier essai en "lissant" les données par une moyenne des 5 dernières valeurs glissantes. Cela permet de réduire les aberrations mais ce n'est pas efficace quand il y en a 4 ou 5 qui se suivent.

    Autre élément important dans ce problème : la moyenne globale est susceptible de changer. Dans l'exemple ci-dessus, les valeurs "normales" tournent autour de 0,205, mais ce chiffre peut augmenter ou baisser dans la durée. Les valeurs aberrantes d'une période peuvent très bien être normales à un autre moment.


    Auriez-vous des idées sur un moyen de résoudre ce défi ?


    Merci d'avance pour votre aide, et toutes les idées, mêmes embryonnaires, sont les bienvenues !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour,

    Tu peux essayer la différentiation (diff avec Matlab) en mettant un seuil.

  3. #3
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Caylith Voir le message
    J'ai fait un premier essai en "lissant" les données par une moyenne des 5 dernières valeurs glissantes. Cela permet de réduire les aberrations mais ce n'est pas efficace quand il y en a 4 ou 5 qui se suivent.
    Et en remplaçant les 5 dernières valeurs par les 5 dernières valeurs valides (donc filtrées) ?

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 216
    Par défaut
    Au moment où tu dois arbitrer pour la valeur de rang I, tu connais déjà les valeurs suivantes ?

    Par exemple, pour valider la valeur 0.208714, tu sais déjà que les suivantes seront 0.209387 puis 0.210538 ?
    Si tu ne le sais pas, il y a de forts risques de dire que ce 0.208714 est faux.

    Si tu connais toutes les données au moment de lancer le process, je procéderais par entonnoir.
    Pur valider la valeur de rang i, tu calcules la moyenne E et l'écart-type S des 5 valeurs précédentes et des 5 valeurs suivantes (en excluant la valeur de rang i, et en excluant les valeurs marquées comme fausses), puis tu testes si la valeur de rang i est entre E - k*S et E + k*S avec k = 3 par exemple.
    Ainsi, tu vas éliminer les plus grosses aberrations.
    Tu testes toutes tes valeurs avec cette méthode.
    Puis tu recommences en prenant k = 2.5, puis k=2 puis k = 1.5

    Au lieu de prendre la moyenne et l'écart-type, tu peux aussi utiliser la médiane, et l'EIQ (Ecart-inter-quartile). L'avantage de ces 2 indicateurs, c'est qu'ils sont beaucoup moins sensibles aux valeurs aberrantes.

    Par exemple, au moment de valider le 0.273856, tu ne sais pas encore que le 0.269893 est faux. Ce 0.269893 va peser lourd sur la moyenne et sur l'Ecart-type. Alors qu'il va peser quasiment rien sur la médiane ou l'EIQ.

    Avec la médiane et l'EIQ, tu peux peut-être faire ton traitement en une seule passe (pas besoin de retraiter avec des filtres de plus en plus serrés).

  5. #5
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Supprimer des valeurs aberrantes dans un flux de données
    Bonjour,

    Il y a peut-être plus simple, les valeurs inadmissibles se situant au-dessus des autres:
    # la plus grande des valeurs acceptées (0,210538) ne dépasse que de 1.9% la moyenne des 4 précédentes (0.206521), tandis que
    # pour les résultat aberrants, le dépassement dépasse 30 % !
    L'installation d'un filtre d'élimination ne doit donc pas poser de difficulté, en fixant un seuil à 5 ou 10 % .

    L'allongement de la liste L2, qui ne contient que les valeurs "normales", se fera par comparaison du nouveau terme examiné (L1[k]), provenant de la liste initiale, avec les 4 derniers de la nouvelle liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    s:= L2[i - 4] + L2[i - 3]; Inc(s, (L2[i - 2] + L2[i - 1])); m:= s / 4;
    e:= |L1[k] - M|; 
    IF (e<(0.08 * M) THEN  L2[i]:=  L1[k];

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour,
    Une idée :
    1-Calcul de la moyenne : moy
    2-Calcul de l'écart-type : ect
    3-Test : si M > moy+2*ect alors on retire la valeur de M et retour à 1

    Exemple avec Matlab :
    Code matlab : 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
    M=[0.204253
        0.204353
        0.204057
        0.203862
        0.204146
        0.203241
        0.273856
        0.269893
        0.198947
        0.204200
        0.204540
        0.205390
        0.204444
        0.204188
        0.279051
        0.204530
        0.203454
        0.208714
        0.209387
        0.210538
        0.209179
        0.208428];
    L=length(M)
    n=0;
    while n<L-1
        n=n+1;
        ect=std(M);
        moy=mean(M);
        if M(n)>moy+2*ect
            M=[M(1:n-1);M(n+1:end)];
            L=length(M);
            n=0;
        end
    end
    M

  7. #7
    Membre très actif
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Par défaut
    La meilleure solution, de très loin, est de comprendre ce qui crée ces valeurs aberrantes et d'y remédier. Car quel que soit le filtre que tu utilises, il y aura toujours des valeurs "limites" dont tu ne pourras déterminer vraiment la validité.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/06/2016, 15h31
  2. Supprimer des valeurs dans un vecteur
    Par tomCB1 dans le forum MATLAB
    Réponses: 7
    Dernier message: 19/06/2014, 14h30
  3. Réponses: 3
    Dernier message: 06/02/2011, 11h14
  4. supprimer des valeurs dans un vecteur
    Par christophe_halgand dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/07/2009, 14h14
  5. Réponses: 2
    Dernier message: 12/01/2004, 13h56

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