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

Statistiques, Data Mining et Data Science Discussion :

Travail sur courbe


Sujet :

Statistiques, Data Mining et Data Science

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut Travail sur courbe
    Bonjour,
    Je reviens demander de l'aide, j'ai un soucis qui maintenant me prend la tête depuis bien trop longtemps, et qui a mon avis ne se résout pas simplement parce que je n'ai plus le niveau en math ...

    Allons y ^^
    J'ai une courbe, une cinétique bactérienne en fait, elle se caractérise par un phase d'accélération (type exponentielle) suivi d'une phase exponentielle, suivi d'une phase de ralentissement qui mène à une phase stationnaire :
    Exemple concret :


    Le but de mon algorithme, que je recherche, c'est de récupérer le point durant lequel on passe d'une croissance à une décroissance, plus proprement dit : le point d'inflexion.
    Ca c'est dans un monde tout beau tout propre et déjà avoir cet algo m'aiderais beaucoup. Mais il faut comprendre que mes cinétiques à traiter sont des observation du vivant, donc le monde n'est pas beau, pas propre, parfois on a des courbes dégueu... Il me faudrait un algorithme souple, du moins autant que possible (quand une bactérie ne pousse pas, pas la peine de chercher a trouver ce point, si il y est de toute manière il n'aura aucune valeur)

    J'ai pensé calculé la différence Y(x1)-Y(x0) Et a partir de la plus grande différence, récupérer l’abscisse que je recherche. Mais malheureusement ça ne prend pas en compte les artefact qui pourrait apparaître en fin de courbe. Il faudrait dans l'idéal "trouver" la phase exponentielle recherché.
    J'ai alors tenté de trouver la phase de ralentissement qui suit cette phase exponentielle en partant du postulat que si 5 valeurs consécutives de différences sont inférieur à la précédente, alors on est au bon endroit, mais là encore pour des courbes "lissé", on aura des résultats mauvais.

    Je suis sur que je suis aller chercher bien trop loin et quasiment certain que ceux qui ont eu le courage de lire n'ont rien compris a mes réflexions, mais je dois avouer que je ne sais plus trop par quel bout prendre mon problème ...
    Images attachées Images attachées  

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 72
    Par défaut
    Bonjour,
    Est-ce que tu veux utiliser un modèle du genre fonction logistique
    pour laquelle on part pratiquement de zéro ensuite on a une phase de croissance raide puis une stabilisation comme ça ?



    le modèle est f(t)= K / (1+a* e^(-r*t))
    avec les points de la courbe observée on peut trouver les valeurs des paramètres K, a et r qui conviennent le mieux.

    Précise ce que tu veux car le point d'inflexion en gros c'est celui qui est au milieu du S.(sur l'image son abscisse vaut 80) ou alors le point où le maximum est pratiquement atteint(sur l'image 220 )

  3. #3
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Bonjour et merci de venir m'aider

    J'ai regardé ça a une époque par le biais de R (que j'ai du abandonné après, il faut que je fasse ça sans les courbes, uniquement avec les valeurs pour chaque cycle d'une heure) et j'avais pris comme modèle de linéarisation une fonction Logistique à 3 arguments :
    f(x) = c + \frac{d-c}{(1+\exp(b(x - e)))^f}
    Avec b, d, e comme valeur à récupérer. (les autres valeurs étant nul, j'imagine)
    Par R, je recherchais l'une de ces trois valeurs, mais je devais passer par des traitement sur la linéarisation (tel qu'une fixation de l'asymptote haute, le retrait d'un ou plusieurs point aberrants, une troncatures des valeurs pour avoir uniquement le motif qui match bien, ...)

    Ca doit correspondent avec ce que tu me donnes, mais dans le même genre, comment traiter ça avec uniquement les valeurs de base, c'est largement au dessus de mon niveau @.@

    Sinon oui, je recherche le milieu du S, en théorie dans mon cas, c'est DOmax/2 (soit en math : Ymax/2) Mais dans les faits, la valeur de DOmax n'est pas toujours égale à la valeur de seuil (parfois on aura des artefacts, parfois on aura une deuxième exponentielle qui commencera).

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Moi je proposerais :

    d'abord une moyenne glissante (sur 3 points) ça lissera la courbe

    Puis simplement une exploration : ton point d'inflection marque la miite entre ce qui a une pente "verticale" (>> 45 degrés) et horizontale (<< 45 degrés). LE moment où tu détectes que tu bascules, c'est là...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 72
    Par défaut
    En fait il faut résoudre l'équation f''(x)=0 (dérivée seconde)

    Si les points connus sont répartis régulièrement (pas h constant)
    il y a des formules qui approchent la dérivée seconde

    f''(x_i) = (y_{i-1} -2y_i + y_{i+1}) / (h^2)

    ou encore mieux

    f''(x_i) = ( - y_{i-2} +16y_{i-1} -30y_i +16y_{i+1} - y_{i+2}) / (12h^2)

    Sur le dessin tu as f en noir, la dérivée en rouge avec le maximum dont tu parlais dans ton premier post et la dérivée seconde en vert.
    C'est plus facile et plus précis de trouver le zéro de la verte que le maximum de la rouge ou que l'inflexion de la noire.
    Comme tu veux la valeur qui annule tu peux laisser tomber le dénominateur
    12h^2 qui reste constant

    Nom : courbes.gif
Affichages : 795
Taille : 4,1 Ko
    je ne sais pas pourquoi l'image (en pj ) s'affiche si petit....il faut cliquer dessus pour l'agrandir

  6. #6
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Je vois deux solutions:

    1) La solution matheuse: faire une régression logistique.
    Ca permet d'obtenir les paramètres a et r de l'équation f(t)= K / (1+a* e^(-r*t)) donnée par kija13; les calculs sont un peut lourd à implémenter, mais d'autres on sûrement déjà fait ça à ta place. Ya plus qu'a trouver la lib qui va bien dans ton langage préféré.

    2)La solution simpliste:
    si pour x=0 tu as toujours y=0, et si pour x suffisamment grand tu as toujours une valeur de y constante (appelons la Y_palier) (sur tes graphs c'est à partir de x=6 ou 7) alors:
    tu peut alors chercher l’intervalle [x_i, x_i+1] dans lequel pour x_i on a y<Y_palier/2 et pour x_i+1 on a y>Y_palier/2, puis pour affiner la valeur de x_inflexion, tu fait une simple interpolation linéaire sur [x_i, x_i+1] et tu résous pour y=Y_palier

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

Discussions similaires

  1. Travailler sur une date
    Par HqX dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/10/2004, 15h54
  2. Travailler sur des sources distantes avec Eclipse
    Par El Saigneur dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 12/07/2004, 09h40
  3. Travailler sur des données qui doivent être triées
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/07/2003, 17h13

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