1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut Lissage de données, en recherche de méthode

    Bonjour à tous,

    Je me permets de venir vers vous pour discuter de lissage de données.

    Je suis à la recherche d'une méthode de lissage me permettant de lisser des données physiques telles que des températures, des pressions etc...

    Nom : tmpp.JPG
Affichages : 283
Taille : 116,9 Ko

    Comme vous pouvez le voir sur le premier graphe qui représente l'évolution d'une température, les données alternent entre différentes phases : des phases où il se passe peu de choses (première partie du graphe) puis d'autres phases où la température évolue avec une certaine signature qui se répète (deuxième partie du graphe).

    Nom : tmp2.JPG
Affichages : 281
Taille : 98,9 Ko

    Sur le deuxième graphe, cette fois ce sont des données de phénomènes vibratoires, qui se répètent également dans le temps.

    Ce sont des données qui présentent régulièrement des intempestifs, c'est à dire des valeurs aberrantes non valides, comme vous pouvez le voir image 3.

    Nom : tmp3.JPG
Affichages : 281
Taille : 21,0 Ko

    J'aimerai donc trouver une méthode de lissage (ou même une méthode par type de donnée, ce n'est pas gênant) permettant de lisser ces données et en particulier de lisser les intempestifs. Etant donner que je gère des données qui sont différentes d'une machine à l'autre, j'aimerai trouver des méthodes de lissage adaptables facilement à tous types de machines, sans avoir à recalculer des coefficients de lissage à chaque fois par exemple.

    J'ai essayé, pour me faire la main, la méthode de lissage exponentielle simple mais elle ne lisse pas les intempestifs par exemple, c'est pour ça que je regarde une méthode plus poussée.

    Si vous avez des pistes à m'indiquer, des méthodes de lissage qui vont semblerez particulièrement adapter, je suis preneur de vos conseils et prêt à en discuter.

    Bonne continuation !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 542
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 542
    Points : 17 022
    Points
    17 022
    Billets dans le blog
    2

    Par défaut

    Bonjour et bienvenue sur ce forum


    tu as déjà une moyenne glissante simple...


    par exemple sur 5 points (en construisant un nouveau tableau, pour que la moyenne glissante ne soit pas perturbée par la moyenne des points précédents) :


    moyenne[i] = (pt[i-2] + pt[i-1] + pt[i] + pt[i+1] + pt[i+2]) / 5.0


    Lors de ce calcul, tu peux calculer les écarts entre la moyenne trouvée et la valeur réelle.
    Ensuite, tu peux faire une passe en éliminant dans les points originaux tout point dont l'écart est supérieur à X, soit les eliminer directement..

    Le premier calcul te donnera une courbe beaucoup plus "lisse" (tu as remplacé les points par la moyenne des 5 points autour).

    Les 2 ensembles t'élimineront les valeurs aberrantes (mais aussi les points corrects entourés de 2 valeurs aberrantes, à moins que ta détermination du X soit correcte)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 033
    Points : 15 596
    Points
    15 596

    Par défaut

    Bonsoir,

    j'ai l'impression que tu cherches davantage à faire de la compression (au sens "audio" = réduire les pics) que du lissage.

    En cherchant "peak compression" sur un moteur de recherche, tu trouveras des explications.
    Et si tu rajoutes "median" et "tanh" à ta recherche, tu peux même avoir de la chance.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Merci à tous les deux pour vos réponses !

    Citation Envoyé par souviron34 Voir le message
    Bonjour et bienvenue sur ce forum


    tu as déjà une moyenne glissante simple...


    par exemple sur 5 points (en construisant un nouveau tableau, pour que la moyenne glissante ne soit pas perturbée par la moyenne des points précédents) :


    moyenne[i] = (pt[i-2] + pt[i-1] + pt[i] + pt[i+1] + pt[i+2]) / 5.0


    Lors de ce calcul, tu peux calculer les écarts entre la moyenne trouvée et la valeur réelle.
    Ensuite, tu peux faire une passe en éliminant dans les points originaux tout point dont l'écart est supérieur à X, soit les eliminer directement..

    Le premier calcul te donnera une courbe beaucoup plus "lisse" (tu as remplacé les points par la moyenne des 5 points autour).

    Les 2 ensembles t'élimineront les valeurs aberrantes (mais aussi les points corrects entourés de 2 valeurs aberrantes, à moins que ta détermination du X soit correcte)
    Technique très intéressante, je te remercie. J'ai essayé de la mettre en place sur un petit exemple fait rapidement sur Excel. J'ai volontairement mis une valeur aberrante à 100, case en rouge.

    Nom : excel.JPG
Affichages : 265
Taille : 47,7 Ko

    Mais comme tu le vois, j'ai 2 problèmes :

    1) Les moyennes mobile à 5 points autours de la valeur aberrante sont toutes un peu faussées. Faudrait-il faire une MM sur 7 ? 9 ? 11 points ?

    2) C'est la même chose pour l'écart (en valeur absolu) entre la valeur réelle et la moyenne mobile : cet écart est grand pour les points situés autour d'une valeur aberrante. Du coup quand j'essaie de filtrer ces points (dernière colonne) si ils dépassent un certain écart X, je me retrouve à filtrer un peu n'importe quoi ! Et surtout, si je considère qu'une valeur doit être écartée, par quoi je la remplace ?


    Citation Envoyé par pseudocode Voir le message
    Bonsoir,

    j'ai l'impression que tu cherches davantage à faire de la compression (au sens "audio" = réduire les pics) que du lissage.

    En cherchant "peak compression" sur un moteur de recherche, tu trouveras des explications.
    Et si tu rajoutes "median" et "tanh" à ta recherche, tu peux même avoir de la chance.
    Effectivement réduire les pics est l'une de mes priorités (et lisser le reste des données est encore mieux!).

    Je suis tombé sur cette page, sans doute que c'était celle-ci à laquelle tu pensais : http://dsp.stackexchange.com/questio...formula-needed

    Nom : median.JPG
Affichages : 268
Taille : 53,4 Ko

    J'ai une question : à quoi correspond le "median of the absolute value over a sliding window as a "typical level" detection" ?

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 033
    Points : 15 596
    Points
    15 596

    Par défaut

    Citation Envoyé par vmbbb Voir le message
    J'ai une question : à quoi correspond le "median of the absolute value over a sliding window as a "typical level" detection" ?
    C'est ce qu'a indiqué Souviron : on remplace chaque valeur par une fonction des valeurs voisines (=la fenêtre).


    La formule qu'a donné Souviron c'est la moyenne des valeurs sur une fenêtre glissante de taille 5:
    moyenne[i] = (pt[i-2] + pt[i-1] + pt[i] + pt[i+1] + pt[i+2]) / 5.0

    Le lien que tu cites suggère d'utiliser la médiane, c'est à dire la valeur qui partage l'ensemble des valeurs en deux parties égales.
    Médiane = la valeur la moins "extrême" = la valeur centrale de l'ensemble trié.

    {10, 4, 8, 9, 3} --trié--> {3, 4, 8, 9, 10} --> médiane=8

    La médiane glissante à l'avantage de supprimer les valeurs extrêmes, c'est à dire les valeurs aberrantes.
    Elle a l'inconvénient de ne pas lisser les données, car on choisit une valeur de l'ensemble de départ.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Merci à toi, je comprend mieux l’intérêt de la méthode !

    Par contre je ne vois pas à quoi sert le calcul avec tanh ? Est-ce que cela s'applique qu'avec certains types de données ? (en sinus ?)

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 542
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 542
    Points : 17 022
    Points
    17 022
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par vmbbb Voir le message
    1) Les moyennes mobile à 5 points autours de la valeur aberrante sont toutes un peu faussées. Faudrait-il faire une MM sur 7 ? 9 ? 11 points ?

    2) C'est la même chose pour l'écart (en valeur absolu) entre la valeur réelle et la moyenne mobile : cet écart est grand pour les points situés autour d'une valeur aberrante. Du coup quand j'essaie de filtrer ces points (dernière colonne) si ils dépassent un certain écart X, je me retrouve à filtrer un peu n'importe quoi ! Et surtout, si je considère qu'une valeur doit être écartée, par quoi je la remplace ?
    • La réponse à ta dernière question est : par la moyenne des voisins compte non-tenu de cette valeur

    • Pour les autres c'est aussi assez simple : soit tu fais le calcul comme suggéré dans la méthode donnée par pseudocode, soit simplement tu refais une passe de moyenne sur l'écart entre la valeur réelle et la moyenne :

      • première passe : calcul d'un tableau "moyenne" et "écart" sur 5

      • seconde passe : calcul du tableau "moyenne des écarts" sur 5 et élimination des pics

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
          si écart[i] <= moyenne des écarts[i]
             val[i] = moyenne[i]   /* ou valeur[i] */
          sinon
             val[i] = moyenne[i] recaculée sans i
          fin si
        Si ci-dessus tu gardes valeur[i] dans la première partie (si), tu auras la courbe originale où simplement les pics seront lissés. Tu peux alors finaliser par faire une troisième passe de moyenne sur 5 qui lissera défintivement la courbe en ayant auparavant lissé les pics
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 033
    Points : 15 596
    Points
    15 596

    Par défaut

    Citation Envoyé par vmbbb Voir le message
    Par contre je ne vois pas à quoi sert le calcul avec tanh ? Est-ce que cela s'applique qu'avec certains types de données ? (en sinus ?)
    Non, pas de rapport direct avec la trigonométrie ou les phénomènes oscillatoires.

    C'est simplement qu'elle à une forme intéressante pour les valeurs x>=0:
    - elle est quasi linéaire (y=x) pour les "petites" valeurs de x (0<x<0.5)
    - elle "compresse" progressivement les valeurs "moyennes" de x (0.5<x<2)
    - et enfin qu'elle limite les valeurs "hautes" de x (x>2)



    C'est donc assez adapté pour faire de la compression en douceur, pour peu qu'on se ramène sur un intervalle [0,2+]
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Citation Envoyé par pseudocode Voir le message
    Non, pas de rapport direct avec la trigonométrie ou les phénomènes oscillatoires.

    C'est simplement qu'elle à une forme intéressante pour les valeurs x>=0:
    - elle est quasi linéaire (y=x) pour les "petites" valeurs de x (0<x<0.5)
    - elle "compresse" progressivement les valeurs "moyennes" de x (0.5<x<2)
    - et enfin qu'elle limite les valeurs "hautes" de x (x>2)



    C'est donc assez adapté pour faire de la compression en douceur, pour peu qu'on se ramène sur un intervalle [0,2+]
    D'accord, et sur le site que je t'ai indiqué ils utilisent plutôt la forme k*tanh(x/k) pour que x/k soit compris entre 0 et 2 si j'ai bien compris. (ou 0,5 et 2 ?). Mais justement, comment choisir ce k ? Est-ce judicieux de le prendre comme étant la moyenne de toutes mes données ?

    Car si je le prend comme étant la moyenne de mes données (ici j'ai pris un exemple avec des température dont une valeur aberrante), je me retrouve avec une courbe (en verte) assez basse par rapport à ma courbe originale (en bleue) :

    Nom : kpetit.JPG
Affichages : 249
Taille : 32,4 Ko

    Et bien sur si je prend un k très grand, je retrouve la courbe originale :

    Nom : kgrand.JPG
Affichages : 245
Taille : 27,6 Ko

    Citation Envoyé par souviron34 Voir le message
    • La réponse à ta dernière question est : par la moyenne des voisins compte non-tenu de cette valeur

    • Pour les autres c'est aussi assez simple : soit tu fais le calcul comme suggéré dans la méthode donnée par pseudocode, soit simplement tu refais une passe de moyenne sur l'écart entre la valeur réelle et la moyenne :

      • première passe : calcul d'un tableau "moyenne" et "écart" sur 5

      • seconde passe : calcul du tableau "moyenne des écarts" sur 5 et élimination des pics

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
          si écart[i] <= moyenne des écarts[i]
             val[i] = moyenne[i]   /* ou valeur[i] */
          sinon
             val[i] = moyenne[i] recaculée sans i
          fin si
        Si ci-dessus tu gardes valeur[i] dans la première partie (si), tu auras la courbe originale où simplement les pics seront lissés. Tu peux alors finaliser par faire une troisième passe de moyenne sur 5 qui lissera défintivement la courbe en ayant auparavant lissé les pics
    Bon, j'ai gardé mon exemple et je te montre ce que j'ai fais :

    Nom : moyenneglissante.JPG
Affichages : 259
Taille : 173,2 Ko

    Les filtres de 4 et 10 correspondent à nos X, je les ai pris au hasard pour l'instant.
    Et j'ai également mis les 2 formules qui me permettent de calculer mes 2 filtrages.
    Est-ce que cela correspond bien à ce que tu m'expliquais ?

    Par contre j'ai un doute : si l'écart est plus grand que X, à la première passe je prend comme valeur (pour la valeur correspond à la valeur aberrante) la moyenne des températures réelles ou la moyenne des moyennes des points autours du point aberrant ? (j'espère que je me fais bien comprendre, cf formule filtrage 1) Et même question à la deuxieme passe ?

    Je trouve que c'est assez intéressant comme méthode et pour avoir un filtrage optimale, ne serait-il pas possible de définir un X comme étant par exemple un certain % de la moyenne des températures et de continuer le filtrage tant que nos écarts dépassent ce X ? En gros ce serait la même chose mais avec dans une grande boucle tant que (pas envisageable sur Excel mais comme je vais coder les méthodes ce serait envisageable).

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 033
    Points : 15 596
    Points
    15 596

    Par défaut

    Citation Envoyé par vmbbb Voir le message
    Car si je le prend comme étant la moyenne de mes données (ici j'ai pris un exemple avec des température dont une valeur aberrante), je me retrouve avec une courbe (en verte) assez basse par rapport à ma courbe originale (en bleue)
    Si ta courbe filtrée est visiblement plus basse, c'est que k n'est pas assez grand. Pour ce ramener "en moyenne" sur l'intervalle [0,0.5], il faut diviser par 2 fois la moyenne.

    Sur le site en question, ils ont choisis "k = 2 x median of the absolute value".
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Citation Envoyé par pseudocode Voir le message
    Si ta courbe filtrée est visiblement plus basse, c'est que k n'est pas assez grand. Pour ce ramener "en moyenne" sur l'intervalle [0,0.5], il faut diviser par 2 fois la moyenne.

    Sur le site en question, ils ont choisis "k = 2 x median of the absolute value".
    Oui mais pourquoi 2 ? Est-ce la valeur optimale ? Le soucis c'est que pour un k trop grand, on retrouve de toute façon la courbe d'origine... alors pas facile de "doser" !

    @souviron34 : aurais-tu un retour à me faire sur la capture de mon fichier Excel que j'ai réalisé ?

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 542
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 542
    Points : 17 022
    Points
    17 022
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par vmbbb Voir le message
    @souviron34 : aurais-tu un retour à me faire sur la capture de mon fichier Excel que j'ai réalisé ?
    Oui.

    Mais excuses-moi j'étais occupé à d'autres choses.

    Je posterais ça demain ou au plus tard jeudi...


    [EDIT]

    Rapidement, j'avais donné une moyenne sur 5 et non 3


    (si toutes les courbes sont du même style)

    [/EDIT]
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Aucun problème

    Oui c'est normal car j'ai juste pris un exemple ici, mais je compte bien mettre une moyenne sur 5 quand je ferai réellement le traitement de mes données !

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    avril 2004
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 653
    Points : 938
    Points
    938

    Par défaut

    Les méthodes utilisant des moyennes ou lissages sont à proscrire. Elles ne ramèneront que partiellement ton point vers la normale, pollueront les valeurs voisines et surtout transformeront un artefact évident en phénomène possible. Si tu as un critère fiable pour déterminer qu'un point est aberrant (une mesure à 100°C dans ton frigo), le mieux est de l'éliminer.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Oui je suis totalement d'accord avec toi mais comment éliminer une valeur, par quoi la remplacer ?

    Le but est que je puisse coder ça en C (C#), et je ne vois pas comment je vais dire au programme d'écarter cette valeur !

    (Je retiens quand même toutes les méthodes abordées jusqu'ici car en dehors d'éliminer les intempestifs je cherche aussi à lisser les valeurs, mais le top serait d'éliminer aux préalables ces pics et de lisser ensuite pour éviter toute "pollution" comme tu le dis)

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    avril 2004
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 653
    Points : 938
    Points
    938

    Par défaut

    La seule raison valable pour éliminer un point est qu'il soit manifestement aberrant. Le critère doit être fondé sur la réalité de ton système. Une façon de l'implémenter est de comparer à la médiane des points environnants : si la valeur est au delà de n ( à déterminer) fois le quartile, ...
    Si tu as absolument besoin de mettre un point à la place, tu peux mettre la valeur précédente, la suivante, la médiane précédemment calculée, mais n'oublie pas qu'elle est arbitraire.
    Quant au lissage, c'est pratiquement toujours une mauvaise idée. Ca transforme des artefacts en signaux et c'est trompeur sur la précision des résultats.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    10 542
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 542
    Points : 17 022
    Points
    17 022
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Nebulix Voir le message
    Les méthodes utilisant des moyennes ou lissages sont à proscrire. Elles ne ramèneront que partiellement ton point vers la normale, pollueront les valeurs voisines et surtout transformeront un artefact évident en phénomène possible. Si tu as un critère fiable pour déterminer qu'un point est aberrant (une mesure à 100°C dans ton frigo), le mieux est de l'éliminer.
    Citation Envoyé par Nebulix Voir le message
    La seule raison valable pour éliminer un point est qu'il soit manifestement aberrant.
    ......
    Quant au lissage, c'est pratiquement toujours une mauvaise idée. Ca transforme des artefacts en signaux et c'est trompeur sur la précision des résultats.


    J'aimerais savoir ce qui te permet d'être aussi affirmatif et "sectaire" vis à vis du lissage ??????

    Dans quel contexte ? De quelles données parle-t-on ?


    Le lissage est une méthode éprouvée, signifiante et significative dans bien des cas...


    Je soupçonne y voir le raisonnement d'un théoricien, qui n'a que très peu fréquenté les applications et mesures réelles...

    L'incertitude des mesures, du bruit (d'origine ou de mesure), sont à l'origine de la quasi-totalité des cas de lissage.. Il est d'ailleurs curieux que tu utilises le terme "évident", car c'est justement tout le problème.... Qu'est-ce qui est "évident" et comment on le détermine ???????


    Quand tu dis "transformeront un artefact évident en phénomène possible." je l'aurais exprimé dans l'autre sens, en tant que physicien : "pourrait éventuellement transformer un phénomène possible en artefact"..

    Un lissage NE PEUT PAS transformer quelque chose en phénomène possible... Par définition il ne peut qu'éliminer trop et donc rendre un vrai phénomène en artefact de bruit...


    Ce qu'on propose est à peu de choses près l'élimination statistique : https://en.wikipedia.org/wiki/Chi-squared_test (test du Chi2), et ce qui sert aussi pour les moindres carrés (https://en.wikipedia.org/wiki/Least_squares), sauf qu'on ne calcule pas exactement le sigma...




    [*

    RETOUR AVEC MA REPONSE A vmbbb UN PEU PLUS TARD

    *]



    [EDIT]

    OK. Alors voici un petit code simple en C, en 3 étapes. Tu peux ajuster celles que tu veux.

    La deuxième étape élimine les pics aberrants, en vérifiant que déjà le point a un écart au delà de la moyenne, puis en vérifiant que les 2 points de chaque côté ont ete "tirés" par ce point-là...

    Code C : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int writefich ( double *t, int n, char *Name )
    {
      FILE *file=(FILE *)NULL ;
      int i ;
     
      if ( (file = fopen(Name,"w")) != NULL )
        {
          for ( i = 0 ; i < n ; i++ )
    	fprintf ( file, "\n%d\t%g",i,t[i]);
     
          fclose ( file );
        }
     
      return 0 ;
    }
     
    int main(int argc, char *argv[])
    {
      int   i, i1, n, low, high, filtre=2, ntemp=20 ;
      double temp[20]={20.0,48.0,42.3,39.9,39.0,41.4,44.0,52.0,53.1,49.7,42.0,40.1,100.0,45.0,50.0,47.0,43.1,41.0,39.0,42.2};
      double moy[20]={0.0},ecart[20]={0.0},moyecart[20]={0.0}, moylocale ;
      double tempresult[20], vrailiss[20]={0.0};
     
     
      /* 
       * Calcul moyenne et ecart sur 5
       */
      for ( i = 0 ; i < ntemp ; i++ ) {
        low = i - filtre ;
        high = i + filtre ;
     
        if ( low < 0 ) low = 0 ;
        if ( high >= ntemp ) high = ntemp ;
     
        n = 0 ;
        for ( i1 = low ; i1 < high ; i1++ ) {
          moy[i] = moy[i] + temp[i1] ;
          n = n + 1 ;
        }
        moy[i] = moy[i] / (double)n ;
        ecart[i] = moy[i] - temp[i] ;
      }
     
      /* 
       * Calcul moyenne des ecarts et remplacement des pics aberrants
       */
      for ( i = 0 ; i < ntemp ; i++ ) {
        low = i - filtre ;
        high = i + filtre ;
     
        if ( low < 0 ) low = 0 ;
        if ( high >= ntemp ) high = ntemp ;
     
        n = 0 ;
        for ( i1 = low ; i1 < high ; i1++ ) {
          moyecart[i] = moyecart[i] + ecart[i1] ;
          n = n + 1 ;
        }
        moyecart[i] = moyecart[i] / (double)n ;
     
        /* Test en fonction de la distance entre l'ecart et la moyenne des ecarts */
        if ( fabs(ecart[i]) < fabs(moyecart[i]) )
          tempresult[i] = temp[i] ;
        else {
          /* Nouveau calcul de la moyenne sans le point central */
          /* UNIQUEMENT SI LES ECARTS D'UN COTE ET DE L'AUTRE SONT DANS LE MEME SENS */
          if ( i != 0 && i != (ntemp-1) ) {
    	if ( (ecart[i]*ecart[i-1] < 0.0) && (ecart[i-1]*ecart[i+1] > 0.0)) {
    	  moylocale = 0.0 ;
    	  n = 0 ;
    	  for ( i1 = low ; i1 < high ; i1++ ) {
    	    if ( i1 != i ) {
    	      moylocale = moylocale + temp[i1] ;
    	      n = n + 1 ;
    	    }
    	  }
    	  moylocale = moylocale / (double)n ;
    	  tempresult[i] = moylocale ;
    	}
    	else
    	  tempresult[i] = temp[i] ;
          }
          else
          tempresult[i] = temp[i] ;
        }
      }
     
     
      /* 
       * Finalement calcul vrai lissage sur 3 en ayant elimine pics aberrants
       */
      for ( i = 0 ; i < ntemp ; i++ ) {
        low = i - filtre ;
        high = i + filtre ;
     
        if ( low < 0 ) low = 0 ;
        if ( high >= ntemp ) high = ntemp ;
     
        n = 0 ;
        for ( i1 = low ; i1 < high ; i1++ ) {
          vrailiss[i] = vrailiss[i] + tempresult[i1] ;
          n = n + 1 ;
        }
        vrailiss[i] = vrailiss[i] / (double)n ;
      }
     
      /* Impression des resultats en table */
      fprintf ( stdout, "\n T\tmoyenne\tecart\tmoyenne ecart\tT resultat\tLissee\n");
      for ( i = 0 ; i < ntemp ; i++ )
        fprintf ( stdout, "\n %g\t%g\t%g\t%g\t%g\t%g",temp[i],moy[i],ecart[i],moyecart[i],tempresult[i],vrailiss[i]);
     
      /* Impression dans fichier */
      writefich ( temp, 20, "Input.dat" );
      writefich ( tempresult, 20, "Output.dat" );
      writefich ( vrailiss, 20, "Lissage.dat" );
     
     
      return 1 ;
    }


    Avec les résultats suivants :

    Elimination du pic :

    Nom : exoutput.gif
Affichages : 170
Taille : 19,3 Ko

    Puis lissage :

    Nom : exlissage.gif
Affichages : 184
Taille : 19,3 Ko


    T moyenne ecart moyenne ecart T resultat Lissee

    20 34 14 1.38333 20 34
    48 36.7667 -11.2333 -0.661111 48 36.7667
    42.3 37.55 -4.75 0.104167 42.3 37.55
    39.9 42.3 2.4 -2.98333 39.9 42.3
    39 40.65 1.65 -0.25625 39 40.65
    41.4 41.075 -0.325 0.95625 41.4 41.075
    44 44.1 0.1 -0.7375 44 44.1
    52 47.625 -4.375 -2 52 47.625
    53.1 49.7 -3.4 -2.04375 53.1 49.7
    49.7 49.2 -0.5 -1.0125 49.7 49.2
    42 46.225 4.225 4.54375 42 46.225
    40.1 57.95 17.85 -5.4125 40.1 43.5417
    100 56.775 -43.225 -1.84375 42.3667 42.3667
    45 58.775 13.775 -0.275 45 44.3667
    50 60.5 10.5 -4.91875 50 46.0917
    47 46.275 -0.725 6.43125 47 46.275
    43.1 45.275 2.175 3.36875 43.1 45.275
    41 42.525 1.525 1.325 41 42.525
    39 41.325 2.325 1.13958 39 41.325
    42.2 40.7333 -1.46667 0.794444 42.2 40.7333




    [/EDIT]





    NOTE: cela ne prendra pas très bien en compte la présence de plateaux à 2 pics.. Pourrais-tu mettre à disposition un exemple de courbe réelle stp ? (comme les 2 premiers graphiques de ton PO)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    avril 2004
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 653
    Points : 938
    Points
    938

    Par défaut

    Désolé mais je maintiens ce que j'ai dit sur le lissage. Il y a une discussion éclairante sur ce point dans Numerical Recipes que je n'arrive pas à télécharger pour l'instant... Je suis physicien expérimentateur et j'ai une grande expérience de l'analyse de données.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  19. #19
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 033
    Points : 15 596
    Points
    15 596

    Par défaut

    Citation Envoyé par Nebulix Voir le message
    Désolé mais je maintiens ce que j'ai dit sur le lissage. Il y a une discussion éclairante sur ce point dans Numerical Recipes que je n'arrive pas à télécharger pour l'instant... Je suis physicien expérimentateur et j'ai une grande expérience de l'analyse de données.
    Tu ne confondrais pas le lissage de données et l'interpolation (ou l'extrapolation) de données ?

    Si ca peut aider: Numerical Recipes mirror
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    avril 2004
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : avril 2004
    Messages : 653
    Points : 938
    Points
    938

    Par défaut a murky area, beyond the fringe of some better posed,

    Merci pseudocode.
    Voilà le passage §14.8 Savitzky-Golay Smoothing Filters)
    We must comment editorially that the smoothing of data lies in a murky area, beyond
    the fringe of some better posed, and therefore more highly recommended, techniques that
    are discussed elsewhere in this book. If you are fitting data to a parametric model, for
    example (see Chapter 15), it is almost always better to use raw data than to use data that
    has been pre-processed by a smoothing procedure....
    Data smoothing is probably most justified when it is used simply as a graphical technique, to
    guide the eye through a forest of data points all with large error bars; or as a means of making
    initial rough estimates of simple parameters from a graph.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Base de donnée personnelle & recherche
    Par remy67 dans le forum MySQL
    Réponses: 3
    Dernier message: 04/01/2009, 20h31
  2. Lissage de données importées
    Par Invité dans le forum MATLAB
    Réponses: 10
    Dernier message: 05/02/2008, 15h49
  3. Réponses: 1
    Dernier message: 05/07/2007, 08h34
  4. Structure de données pour recherche rapide
    Par socrate dans le forum C
    Réponses: 1
    Dernier message: 18/06/2006, 14h49
  5. Réponses: 2
    Dernier message: 10/11/2005, 16h59

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