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

  1. #21
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut Supprimer des valeurs aberrantes dans un flux de données
    Bonjour,
    Un FAE est un filtre qui élimine les fréquences du signal hors Bande Passante utilisée.
    Il convient mal à ton cas car il réduit le signal et le retarde.

    En revanche je te propose un filtre de kalman stationnaire (gains fixes) d'ordre deux en testant l'innovation.
    Cela ne prend que 8 instruction de calculs simples.
    Un exemple avec excel :
    Fichiers attachés Fichiers attachés

  2. #22
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Cool ! Je vais regarder cela.

    En attendant voici l'avancement des choses. J'ai une recette qui commence à donner de bons résultats :

    - Je prends les 21 dernières valeurs, j'appelle [A] la médiane des 9 les plus anciennes,
    - J'appelle [B] la valeur "scrutée" (la suivante des 9 plus anciennes),
    - J'appelle [C] la médiane des 11 plus récentes,
    - J'appelle [D] la moyenne des 11 plus récentes (ça, c'est pour une petite cuisine interne qui améliore le résultat).

    Si B est dans le bruit de fond de A, la valeur est bonne, je la garde. Sinon...
    ...si B est dans le bruit de fond de C et aussi dans celui de D, je la garde, c'est qu'elle correspond à un nouveau palier.

    Sinon, je la remplace par A. Obtiens donc une valeur [B] que je considère valide.

    Puis je lisse le signal en faisant la moyenne des 5 dernières valeurs B validées, et c'est ça que j'injecterai dans mon process. J'aurai 11 secondes de retard sur l'arrivée des données, ce qui est acceptable.

    Les simulations sous Excel sont encourageantes :

    Sur des aberrations franches : succès total !
    Nom : Lissage1.png
Affichages : 535
Taille : 36,5 Ko

    Sur des valeurs aberrantes qui précèdent un palier : c'est pas mal ! [Je ne sais pas vous mais chez moi le graphique n'apparaît pas]
    Nom : Lissage2.png
Affichages : 631
Taille : 22,5 Ko

    À noter que si on zoome le graphe ci-dessus, on voit qu'il n'y a qu'une seule valeur qui est restée
    Nom : Lissage3.png
Affichages : 571
Taille : 14,5 Ko

    Et avec mon lissage final des 5 dernières valeurs validées, l'aberration résiduelle se dilue dans le reste : [Là aussi le graphique fait défaut... bizarre bizarre, enfin bon, c'est le même que le précédent mais le pic résiduel est 5 fois moins haut et 5 fois plus large]
    Nom : Lissage4.png
Affichages : 618
Taille : 14,3 Ko

    Enfin un effet très positif que je n'avais pas prévu : quand le système oscille, l'algo tire droit (on ne va pas bouder ça !) :
    Nom : Lissage5.png
Affichages : 608
Taille : 62,1 Ko


    Encourageant, donc, mais pas encore fonctionnel car sur le jeu de données avec la montée en puissance, il décroche et fait de longs paliers au lieu de suivre la courbe. Affaire à suivre.



    Maintenant, j'ai toute la nuit pour regarder ce filtre de "Kalman" que tu proposes (on est geek ou on ne l'est pas !)

  3. #23
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Heu, Phryte, ton fichier est également très prometteur, mais il n'y a pas les formules... C'est quoi les 8 calculs simples ?


    Merci d'avance !


    Au fait, quelqu'un m'avait demandé un jeu de données : Jeu1.rar

    C'est du CSV avec séparateur ";", et attention à remplacer les "." par des "," sous excel. La valeur brute est la première après la date, le reste n'a pas d'importance.

  4. #24
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut Supprimer des valeurs aberrantes dans un flux de données
    Bonjour,
    Regarde la macro : Développeur - Visualiser le code

  5. #25
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Pour la partie 'montée en puissance, tu peux essayer d'ajouter la condition suivante :
    Si B est entre A et C, alors B est valide.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #26
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bien vu TBC !

    Et ça marche très bien pour la montée en puissance (je mettrai un graphique détaillé ce soir). Par contre ça ne passe pas le test de non-régression ! En effet je reperd le lissage miraculeux de la période oscillatoire du premier jeu de données.

    Après j'ai essayé encore plus simple : comme l'amplitude des aberrations ne dépasse pas 0,075, si A et C sont éloignés de plus de 0,1, c'est qu'il se passe quelque chose de réel. Dans ce cas je conserve la valeur scrutée. Le résultat est moins bon que ta méthode pour la montée en puissance, mais conserve le lissage de la période oscillatoire.

    Bon, prochaine étape, tester le filtre de Kalman sur un jeu de données complet.

  7. #27
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Rôgarde comme c'est beau !

    En bleu les valeurs brutes, en rouge les valeurs issues de ma petite cuisine + le test de Tbc92, et en vert les mêmes lissées par une moyenne des 5 dernières valeurs.

    Nom : Lissage montée.png
Affichages : 523
Taille : 62,6 Ko

    Après réflexion, je pense qu'il vaut mieux en rester là (tant pis pour la perte du lissage miraculeux des périodes oscillatoires). Je vais déjà implémenter cette méthode dans l'automate et voir ce que ça donne en réel, puis extraire quelques jeux de données pour essayer de faire mieux si besoin.

    L'algo de Kalman, je n'ai pas encore réussi à le faire fonctionner sur un jeu de données complet... il décroche très vite et s'éloigne des données initiales.

  8. #28
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,

    Peux- tu envoyer un échantillon de données qui divergent avec Kalman.

  9. #29
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Tu peux utiliser le jeu de données que j'avais mis en pièce jointe, et sinon un petit exemple sur une vingtaine de valeurs :

    0,236707
    0,236669
    0,236881
    0,237086
    0,236636
    0,237188
    0,236690
    0,236671
    0,237795
    0,236233
    0,236669
    0,236785
    0,236883
    0,235900
    0,237204
    0,238071
    0,237676
    0,236789
    0,237047
    0,236204
    0,238544
    0,236713


    Je suppose qu'il faut trouver les bons paramètres pour K1, K2 et Te. J'ai fait plusieurs essais mais sans succès : chez moi il diverge à partir de la zone rouge.

    L'algo paraît "instable", ce qui en soi n'est pas grave, on peut ajouter un rattrapage quand il diverge trop. Mais il faut quand même qu'il fonctionne sur un nombre "convenable" de données, pas qu'il faille le rattraper toutes les 15 valeurs...

  10. #30
    Membre émérite

    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 : 77
    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
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Caylith Voir le message
    ... le procédé étant de nature thermique, il a une inertie importante en comparaison de la chaîne de régulation : temps de réponse du procédé = environ 1 à 2 minutes, temps de réponse du régulateur = 1s.
    ... / ...c'est pour cela que je pense pouvoir me permettre un "retard à la décision" de 10s, mettons 20s maximum, sans que cela ait trop d'influence sur la chaîne de régulation ...
    Citation Envoyé par Caylith Voir le message
    ... Oui, il arrive une nouvelle valeur chaque seconde. Donc 10 valeurs en 10s, et comme un retard de 10s me semble acceptable, cela permet éventuellement d'avoir 10 valeurs "futures" ...
    Deux procédés susceptibles de supprimer les variations erratiques des données expérimentales, et portant sur les (2*N) dernières valeurs collectées (soit pour N = 10 un intervalle temporel de 20 s, et un décalage moyen de 10 s).
    On note la liste de travail L0 = (Y1-2*N , ... , Yi , ... , Y0) ; elle est indexée par l'indice relatif (i), dont la borne supérieure (0) correspond à la valeur actuelle (dernière mesure enregistrée).

    1°) Calcul d'une moyenne retardée: une simple combinaison linéaire à coefficients non constants, et dont la variation sur [1-2*N ; 0] est représentée par une courbe en cloche symétrique;
    en posant: Ci = (1-i)2*(2*N+i)2 et CT = Somme(1-2*N)0(Ci) = 136136 (pour N = 10) ,
    on obtient très simplement la valeur moyenne: Ym = (1/CT)*Somme(1-2*N)0(Ci*Yi) , qui représente une bonne estimation de la grandeur mesurée, antérieure de (N - 1/2) secondes au présent (soit, pour N = 10, un décalage de 9.5 s).

    2°) Calcul d'une moyenne actuelle: partager (L0) en deux sous-listes de même longueur:
    L1 = (Y1-2*N , ... , Yi , ... , Y-N) et L2 = (Y1-N , ... , Yi , ... , Y0) .
    Entreprendre sur chacune d'elles une régression linéaire conduisant à l'équation de la droite des moindre carrés, au coefficient de corrélation (r) et à la dispersion d = (1 - r2)(1/2) ; on dispose alors de deux groupes de résultats (a1, b1, r1, d1) et (a2, b2, r2, d2) dont le plus fiable correspond à la plus faible dispersion (d << 1 , (1 - |r|) << 1).
    D'où la possibilité d'accéder à l'équation d'une droite moyenne, avec des coefficients inversement proportionnels à (dk):
    y = A*x + B , avec A = (d2*a1 + d1*a2) / (d1 + d2)
    et B = (d2*b1 + d1*b2) / (d1 + d2) ...
    ainsi qu'à la valeur actuelle corrigée, tout simplement donnée par l'ordonnée à l'origine:
    x = imax = 0 d'où: Ycorr = Y(0) = B .
    Le calcul de (A) se révèle ici inutile.

    Je serai curieux de voir l'aspect du graphe, si quelqu'un se lance dans le calcul.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  11. #31
    Membre émérite
    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
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonsoir,
    Le facteur sensible est le test sur l'innovation.
    On peut l'ajuster sur la moyenne des 10 premières valeurs.
    Il peut aussi être ajusté en temps-réel.
    Essais :

  12. #32
    Membre à l'essai
    Homme Profil pro
    Geek débile créatif
    Inscrit en
    Janvier 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ukraine

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonjour à tous !


    Petit bilan de mon problème de lissage, qui est apparemment résolu (je suis en phase de test).

    Alors après quelques erreurs "créatives" (vous savez, la faute de frappe qui, lorsqu'on s'en rend compte, fait comprendre que le calcul ne sert à rien... dans mon cas, un seuil à 0,0001 au lieu de 0,001 qui rendait complètement inutile mon test puisque toutes les valeurs étaient en dehors du seuil), j'ai drastiquement simplifié l'algo pour un résultat quasiment identique.


    En résumé, l'algo de base était :

    1) je calcule A la médiane des 9 valeurs (les plus anciennes) qui précèdent la valeur courante,
    2) je considère B la valeur courante pour savoir si je la valide ou pas,
    3) je calcule C la médiane des 11 valeurs suivantes,
    4) je calcule D la moyenne des 11 valeurs suivantes,
    5) je regarde si la valeur courante est entre A et C,

    - Si la valeur courante est dans le bruit de fond de A ou (B et aussi C), je la garde [condition 1],
    - Sinon si (5) est vrai, je la garde,
    - Sinon je la remplace par A,
    - Puis je lisse le résultat par une moyenne des 5 dernières valeurs validées.

    Et ça marche mais je me suis donc rendu compte qu'avec un seuil pour le bruit de fond 10x trop faible, la condition 1 n'était jamais respectée (c'était pourtant ça l'algo de base...).

    D'autre part, les fonctions mathématiques de l'automate étant très spartiates, le calcul d'une médiane est franchement pénible à implémenter, alors qu'une moyenne se calcule en 1 instruction. J'ai donc avantageusement remplacé le calcul de médiane par un calcul de moyenne, et le résultat était pratiquement le même.

    Conclusion, l'algo actuel consiste à :

    1) Calculer A = la moyenne des 5 valeurs (les plus anciennes) qui précèdent la valeur courante,
    2) Calculer C = la moyenne des 6 valeurs suivantes,
    3) Regarder si la valeur courante B est entre A et C, (personnellement, j'ai fait (C-B) x (B-A) et je regarde si c'est >0)

    Si oui, je la garde, si non, je la remplace par A.
    Puis je fais le lissage final (très important, celui-ci) par moyenne des 5 dernières valeurs validées. Soit je calcule cette nouvelle moyenne, soit j'utilise A qui est déjà la moyenne des 5 valeurs validées, mais du round précédent (dans ce cas je perds 1s dans mon flux mais je gagne une ligne de programme).


    Résultat illustré :

    (en bleu les données brutes, en jaune la simulation Excel, en rose le vrai résultat calculé par l'automate)

    Nom : Lissage API montée.png
Affichages : 569
Taille : 18,0 Ko

    Le décalage entre simulation et API est probablement lié au fait que pour avoir les 6 valeurs "suivantes" dont on calcule la moyenne, il faut attendre 6s, dont je ne tient pas compte dans mon tableau Excel.


    Donc au final, c'est le petit test de Tbc92 (qui permettait d'éviter le décrochage) qui fait 80% du boulot de l'algo, les 20% restants étant le lissage final qui écrête les valeurs aberrantes résiduelles.


    Concernant les idées non exploitées, je n'ai pas repris l'algo de Kalman que je n'avais pas réussi à faire fonctionner (à l'occasion pendant mes longues soirées d'hiver je m'y replongerai, parce qu'il paraît bien intéressant pour un algo si simple), et les deux méthodes énoncées par Wiwaxia dans le dernier post, heu, comment dire... t'es dur avec moi, là, et je ne trouve plus la boite de doliprane ! Mais je relirai le post à tête reposée.


    En tout cas un grand merci à tous pour vos idées, vos conseils, votre aide. Je suis arrivé ici sans savoir à quoi servait une médiane, et je repars avec un algo fonctionnel, et une boite à outils bien plus riche.


    Longue vie au forum et merci à tous.

  13. #33
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    plutôt que d'utilisé un seuil fixe pourquoi ne pas calculer un intervalle de confiance
    et de vérifier que ta nouvelle donné se trouve dans cette intervalle
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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