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

Calcul scientifique Python Discussion :

regression non linéaire


Sujet :

Calcul scientifique Python

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 160
    Points : 41
    Points
    41
    Par défaut
    Salut !

    Oui pardon, c'est loin d'être clair je me rend compte... Mais il faut considérer mes derniers post,, comme tu l'as fais =)

    merc je vais regarder ça plus en précision

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 160
    Points : 41
    Points
    41
    Par défaut
    Du coup c'est bon, l'algorithme marche, j'ai du virer les nan aussi. Il me renvoi pas les paramètre d'entrée mais bon, ça ne fit pas du tout mes données... Nom : badfit.png
Affichages : 193
Taille : 328,6 Ko

    Code : 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
     
    from numpy import *
     
    x=psi.ravel()
    a,b,c = 20, 20, 20
    y_true = a*cos(b-xbis)+c
    y_meas = target.ravel()
     
    #remove nan values
    xbis = x[~np.isnan(x)]
    y_meas_bis = y_meas[~isnan(xbis)]
    y_meas_f = y_meas_bis[~isnan(y_meas_bis)]
    x_f = xbis[~isnan(y_meas_bis)]
     
    def residuals(p,y,x):
        a,b,c = p
        err = y-(a*cos(b-x)+c)
        return err
     
    def peval(x,p):
        return p[0]*cos(p[1]-x)+p[2]
     
    p0 = [10,10,10]
    from scipy.optimize import leastsq
    plsq = leastsq(residuals, p0, args = (y_true,xbis),full_output = 1)
     
     
    fig = pl.figure()
    ax = pl.subplot(111)
    pl.plot(x,y_meas,'b.',ms=0.01)
    pl.plot(x_f,peval(x_f,plsq[0]),'k.',ms=0.01)
    ax.set_ylim([-100,100])
    pl.show()

  3. #23
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut!

    ça m'a tout l'air d'être bancal tout ça. Avoir NaN c'est pas bon signe en général.

    En voyant le graph que tu as posté, j'ai l'impression que tu cherches à fitter un nuage de point (en bleu) par une fonction de type sinusoïdale. Il me semblait que le problème était plutôt de recaler ou de déterminer le décalage entre deux images...

    Est-ce que tu as envisagé d'autres pistes? Il y a plusieurs personnes ici qui me semblent assez calés en traitements d'images. Peut-être n'ont -ils pas lu ce fil.


    Ju

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 160
    Points : 41
    Points
    41
    Par défaut
    Salut,

    En fait fitter ce nuage de point par une fonction sinusoïdale revient à estimer les paramètres a,b,c qui vont nous permettre de connaitre le décalage entre les deux images (a norme du vecteur entre les deux images, b sa direction et c un biais, plus il est proche de zero mieux c'est)

    L'image contient pas mal de NaN car il y a des régions avec des "trous" donc pas de données.

    Merci pour ton aide =)

  5. #25
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Ah ok.

    Je vois mieux. Imaginons que l’on récupère tous les pixels non blancs et non vides. On souhaite avoir deux listes : x_meas et y_meas de même taille contenant les coordonnées des pixels (je pense que c’est faisable).

    A partir de là je pense qu'il ne sera pas dur de fitter. On ne parle plus de matrices ni d'images, mais juste de vecteurs. C'est un problème courant.

    EDIT

    Je suis ok avec ce que tu as écris (code), dans l'ensemble. Je ne peux pas faire de test mais voici ce que j'aurais fait:

    Code : 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
    # -*- coding: utf-8 -*-
     
    import numpy as np
    from scipy.optimize import leastsq
    import matplotlib.pyplot as plt
     
    # Ici on lit l image et on recupere la position des pixels.
    # Ou autre process si le nuage de point est un resultat
    # On doit avoir x_meas et y_meas de meme taille (les points bleus)
     
    def peval(x, p):
        """Function to evaluate"""
        return p[0]*np.cos(p[1]-x) + p[2]
     
    def residuals(p, y, x):
        """Compute residual vector according to parameter p"""
        return y - peval(x, p)
     
    # Starting values
    p0 = [20., 20., 20.]
     
    # Evaluation of the parameters
    plsq = leastsq(residuals, p0, args=(y_meas,x_meas), full_output = 1)
    print plsq
     
    # Plot
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x_meas, y_meas color='blue')
    ax.plot(x_meas, peval(x_meas,plsq[0], color='black')
    plt.show()
    Tu pourrais aussi regrouper plusieurs points avant d'essayer de fitter une courbe.

    Ju

Discussions similaires

  1. regression non linéaire
    Par thtghgh dans le forum Mathématiques
    Réponses: 8
    Dernier message: 16/09/2011, 14h49
  2. Regression non linéaire - Prédicteurs
    Par thtghgh dans le forum SAS STAT
    Réponses: 11
    Dernier message: 14/11/2010, 13h04
  3. Regression non linéaire
    Par sfiliste dans le forum Mathématiques
    Réponses: 28
    Dernier message: 28/09/2010, 12h17
  4. Regression non linéaire
    Par DooX4EvEr dans le forum MATLAB
    Réponses: 0
    Dernier message: 11/08/2010, 13h01
  5. Loi de King - Regression non linéaire
    Par damienw dans le forum Mathématiques
    Réponses: 6
    Dernier message: 14/05/2008, 21h32

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