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 :

Moyenne de n courbes dont les points n'ont pas les mêmes valeurs exactes en abcisse


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Moyenne de n courbes dont les points n'ont pas les mêmes valeurs exactes en abcisse
    Bonjour,

    voici un exemple de données à traiter (cf pièce jointe si l'image ne s'affiche pas dans le texte)


    Il s'agit de générer une courbe moyenne à partir de ces différents essais.
    Comme vous pouvez le voir, selon la série les premières valeurs ne commencent pas à la même abscisses, mais ce n'est pas à priori un gros problème puisque je peux faire une recherche de la valeur maximale dans la colonne abscisses de chaque série et éliminer toutes les données relatives à au dessus du minimum des abscisses maximum (en gros tout ce qui est au dessus de 40,94 je supprime).
    Par contre le réel problème c'est qu'on ne retrouve pas forcément une abscisse d'un point d'une série dans une autre. Par exemple dans la série e9 et e10 on a 40.94 mais dans la série e 11 la valeur la plus proche est de 40.87.
    J'avais pensé à faire un nettoyage en arrondissant au dixième supérieure, ce qui donnerait dans une même série des valeurs d'abscisses identiques dont je ne devrais en garder qu'une.
    Sinon supprimer les valeurs d'abscisses inférieure à un pas définit (exemple tous les 0.5 ou 1 ou 2), mais ça me pose d'autre problèmes.

    En fait je ne sais pas dans quelle direction partir et je me disais qu'il existait peut-être déjà un algorithme pour faire ce genre de moyenne.

    Si non comment procéderiez vous ?

    Merci d'avance pour votre aide,

    David

  2. #2
    Expert éminent sénior
    Bonjour

    T'aurais pu faire un copier-coller plutôt que de faire une image. On ne peut pas traiter les données.

    Si non comment procéderiez vous ?
    Pour l'algorithme :
    • On trie les abscisses croissantes
    • On les parcourt dans l'ordre pour définir la valeur de la série que l'on prend.
    • On calcule la moyenne, si la moyenne a du sens (au moins une valeur pour chaque)
    • On passe à la ligne suivante.


    Exemple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat fichier.txt
    41.31 0.366 9
    41.28 0.371 9
    41.24 0.369 9
    41.2 0.369 9
    40.94 0.386 9
    40.87 0.412 9
    40.94 0.216 10
    40.77 0.215 10
    41.35 0.744 11
    40.87 0.873 11
    39.58 1.262 11


    On trie :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sort +0n fichier.txt                                                                                                                                                                                                                                       
    39.58 1.262 11
    40.77 0.215 10
    40.87 0.412 9
    40.87 0.873 11
    40.94 0.216 10
    40.94 0.386 9
    41.2 0.369 9
    41.24 0.369 9
    41.28 0.371 9
    41.31 0.366 9
    41.35 0.744 11


    On calcule la moyenne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ sort +0n fichier.txt | awk '{a[$3]=$2;if (a[9]*a[10]*a[11]!=0) r[$1]=(a[9]+a[10]+a[11])/3;} END{for (i in r) print i,r[i];}' | sort +0n
    40.87 0.5
    40.94 0.491667
    41.2 0.486
    41.24 0.486
    41.28 0.486667
    41.31 0.485
    41.35 0.442


    Et voilà le travail !
    Tu peux préférer une interpolation pour la valeur d'un point (que tu n'as pas) entre 2 points (que tu as).

    Bonne chance
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Nouveau membre du Club
    Oui désolé pour les données, je pensais qu'une image serait plus claire à interpréter. Je n'ai pas pensé que quelqu'un ferait le travail à ma place donc je n'ai pas fait de copier coller
    En tout cas merci pour l'idée : je n'avais pas du tout penser à agréger les différentes séries. Je vais réfléchir à ce que tu me proposes.

  4. #4
    Rédacteur/Modérateur

    Dans la série e9, tu as comme abscisses 40.94, 40.9 , 40.87
    Mais dans la série e10, tu n'as pas les valeurs 40.9 ou 40.87
    Ma proposition, ce serait de faire une interpolation.
    Dans la série e10, tu as les points 40.88 et 40.92 qui encadrent 40.9 , et 40.9 est au milieu entre 40.88 et 40.92.
    Donc tu peux estimer par interpolation.
    Et idem pour chaque point manquant.
    Pour 40.87, tu vas trouver (0.243*2+0.221)/3 = 0.23567
    Et ensuite , tu as bien tes 3 points pour l'abscisse 40.87 , et tu peux faire la moyenne des 3 valeurs.


    Si tu mets toutes tes valeurs dans un tableau, et que tu calcules une espèce de tendance, tu auras beaucoup de points issus de la série e9 (tu as en gros un écart de 0.04 entre 2 points successifs) alors que tu auras peu de points issus de la série e11 ( en moyenne 0.16 entre 2 points consécutifs) ; la série e11 sera donc sous-représentée dans le résultat final.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Nouveau membre du Club
    Citation Envoyé par tbc92 Voir le message

    Ma proposition, ce serait de faire une interpolation.
    Oui en fait c'est ce que je fais à la main déjà.

    Citation Envoyé par tbc92 Voir le message

    Si tu mets toutes tes valeurs dans un tableau, et que tu calcules une espèce de tendance, tu auras beaucoup de points issus de la série e9 (tu as en gros un écart de 0.04 entre 2 points successifs) alors que tu auras peu de points issus de la série e11 ( en moyenne 0.16 entre 2 points consécutifs) ; la série e11 sera donc sous-représentée dans le résultat final.
    Oui c'est bien le problème. C'est la raison pour laquelle j'avais pensé au début nettoyer les valeurs dans la(les) séries surreprésentées en leur conférant un "pas" qui ne soit pas inférieur à celui moyen entre chaque valeur de la série sous-représentée.


    En attendant j'essaie de comprendre ce que fait le script de Flodelarab.
    Je travaille avec VBA....

  6. #6
    Expert éminent sénior
    Citation Envoyé par dafchap Voir le message
    En attendant j'essaie de comprendre ce que fait le script de Flodelarab.
    Chaque série a son représentant, c'est-à-dire, une ordonnée qui va être utilisée dans la moyenne. Tant qu'une des séries n'a pas donné de représentant, il ne faut pas calculer la moyenne, sinon la valeur va sauter, au seul prétexte qu'on a oublié une série. La valeur par défaut étant 0, le produit de tous les représentants permet de contrôler qu'aucun n'est nul. Pour chaque ligne, on fixe, ou change, un représentant, et si une moyenne est calculable, on la calcule, et on la garde en mémoire pour l'abscisse de la ligne. Ceci a la vertu d'écraser la précédente valeur si plusieurs représentants changent pour la même abscisse. Dans mon exemple, 40.87 fait changer le représentant de 9 et le représentant de 11. À la fin, pour chaque abscisse, on affiche l'abscisse et la moyenne pour cette abscisse. Comme les résultats peuvent être justes mais en vrac, on re-trie.

    Cet algorithme est vite écrit grâce aux tableaux associatifs. Sous VBA, c'est l'objet Collection :
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim oC As New Collection
    oC.Add "bonjour", "mot1"
    oC.Add "Au revoir", "mot2"
    MsgBox oC("mot1")


    oC.Add element,clé

    Ajoute un élément à la collection. La clé correspond à ce qu'il y a dans les crochets d'un tableau associatif.

    oC.remove clé

    Supprime l'élement dont la clé est passée en paramètre

    oC(clé)

    retourne l'élément dont la clé est passée en paramètre
    Source : https://www.developpez.net/forums/d2...x-associatifs/
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Nouveau membre du Club
    Merci pour ces explications détaillées. Je pense qu'avec ça je devrais pouvoir me débrouiller.

  8. #8
    Membre expérimenté
    Les valeurs sont très différentes d'une série à l'autre. Il me parait étonnant de vouloir en faire une moyenne. Pourquoi le fais tu ?
    Sinon, j'aurais utilisé un "binning" : faire la moyenne des valeurs dans des intervalles déterminés, par ex : 4.8-4.9, .
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  9. #9
    Membre chevronné
    Moyenne de n courbes dont les points n'ont pas les mêmes valeurs exactes en abcisse
    Bonjour,

    La remarque qui vient d'être faite est pertinente,
    Citation Envoyé par Nebulix Voir le message
    ... sinon, j'aurais utilisé un "binning" : faire la moyenne des valeurs dans des intervalles déterminés, par ex : 4.8-4.9, .
    d'autant qu'un calcul de moyennes n'a de sens que sur un lot de valeurs relativement proches.

    D'autre part, la question de la relation théorique entre (x) et (y) n'a pas été soulevée (à moins que cela m'ait échappé):
    Citation Envoyé par dafchap Voir le message
    ... voici un exemple de données à traiter ... / ... Il s'agit de générer une courbe moyenne à partir de ces différents essais ...
    Le graphe médian du nuage de points ne serait donc pas rectiligne ?
    Et s'il doit intervenir une relation non linéaire, laquelle faut-il prendre ?
    y = A + Bx + Cx2 , Ln(y) = A - B/x ?

    On a l'embarras du choix ...


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

  10. #10
    Rédacteur/Modérateur

    On pourrait reformuler le besoin. Comment trouver le coefficient multiplicateur entre 2 fonctions f et g ... sachant qu'on connait f et g sur un échantillon de points, et que ce ne sont pas les mêmes points qui sont connus pour f et pour g.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre chevronné
    Moyenne de n courbes dont les points n'ont pas les mêmes valeurs exactes en abcisse
    Un procédé très simple permet de s'assurer de la légitimité du calcul de moyenne: le tracé du nuage des points de coordonnées (x, y).

    Il doit présenter une zone dense connexe, ou tout au moins présentant un seul segment d'intersection avec toute droite verticale (x = Cte).
    Dans le cas contraire, il faut envisager une partition du nuage.


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

###raw>template_hook.ano_emploi###