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

MATLAB Discussion :

Regression non linéaire


Sujet :

MATLAB

  1. #1
    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 Regression non linéaire
    J'essaye en fait de trouver les paramètres qui vont fitter au mieux mes jeux de données, (voir figure jointe).

    Pièce jointe 139822

    La fonction qui régis ce jeu de donnée est de la forme : a*cos(b-psi)+c. Je cherche donc à minimiser : données-a*cos(b-psi)+c afin d'estimer au mieux les paramètres a,b et c qui fitte le mieux mes données.

    Je connais psi et mes données.

    voici les paramètres initiaux que j'entre dans mon programme : [3.8,1.3,0]

    J'ai donc essayé le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    clear all
    close all
    clc
     
    psi = load('psi.txt');
    target = load('target.txt');
     
    xdata = reshape(psi,1201*1201,1);
    ydata = reshape(target,1201*1201,1);
     
    fit_values=lsqcurvefit(@(x0,x)x0(1)*cos(x0(2)-x)+x0(3),[3.8,1.3,0],xdata,ydata);
    mais voici le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Error using snls (line 48)
    Objective function is returning undefined values at initial point.
    lsqcurvefit cannot continue.
     
    Error in lsqncommon (line 150)
        [xC,FVAL,LAMBDA,JACOB,EXITFLAG,OUTPUT,msgData]=...
     
    Error in lsqcurvefit (line 253)
    [xCurrent,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
     
    Error in leastsq (line 11)
    fit_values=lsqcurvefit(@(x0,x)x0(1)*cos(x0(2)-x)+x0(3),[3.8,1.3,0],xdata,ydata);
    Pour avoir une idées des variables que je manipule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
      Name              Size                 Bytes  Class     Attributes
     
      psi            1201x1201            11539208  double              
      target         1201x1201            11539208  double              
      xdata       1442401x1               11539208  double              
      ydata       1442401x1               11539208  double
    Du coup, je ne comprend pas très bien comment manipuler les fonctions de minimisation de matlab, auriez vous quelques conseils à me donner ?

    Merci d'avance

  2. #2
    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
    Par ailleurs si je modifis le code comme suivant, je n'ais plus le message d'erreur, mais les paramètre qui sorte de la minimisation sont exactement les mêmes que ceux que j'ai mis en entrée :

    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
     
    clear all
    close all
    clc
     
    psi = load('psi.txt');
    target = load('target.txt');
     
    xdata = reshape(psi,1201*1201,1);
    ydata = reshape(target,1201*1201,1);
    i=find(~isnan(xdata));
    xdata = xdata(i);
    ydata = ydata(i);
    j = find(~isnan(ydata));
    xdata = xdata(j);
    ydata = ydata(j);
    fit_values=lsqcurvefit(@(x0,x)x0(1)*cos(x0(2)-x)+x0(3),[8,8,0],xdata,ydata);
    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
     
     
    Local minimum possible.
     
    lsqcurvefit stopped because the size of the current step is less than
    the default value of the step size tolerance.
     
    <stopping criteria details>
     
     
    Optimization stopped because the norm of the current step, 5.960464e-07,
    is less than options.TolX = 1.000000e-06.
     
    Optimization Metric                                 Options
    norm(step) =   5.96e-07                      TolX =   1e-06 (default)
     
    >> fit_values
     
    fit_values =
     
         8     8     0

  3. #3
    Membre habitué
    Profil pro
    Doctorant
    Inscrit en
    Mars 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 147
    Points : 196
    Points
    196
    Par défaut
    (je n'ai pas regardé ton code mais juste tes commentaires)
    Pour ton premier message, il semblerait que tes paramètres initiaux conduisent à des problèmes. Je te conseille de les mettre directement dans ta fonction d'optimisation et voir ce que ça donne.
    Pour ton second message, j'ai souvent ce problème avec lsqnonlin, il faut que tu joues avec les paramètres d'optimisation ici TolX (mais après tu vas peut être devoir en modifier d'autres comme MaxFunEvals. Le problème est que tu tombes sur des solutions qui sont des minimums locaux.
    Voici un exemple de ce que j'ai fait sur un programme (différent du tien mais c'est pour les paramètres et la syntaxe).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    options=optimset;
    options.MaxIter=1000;
    options.MaxFunEvals=1500;
    options.TolFun=1e-12;
    options.TolX=1e-12;
    opt= @(x)optPDFV1(x,G,wt,W);
    [x,resnorm] = lsqnonlin(opt,xo,[-1000,-1000,-1000,-1000],[1000,1000,1000,1000],options);
    Sinon, essaie d'autres conditions initiales.


    Matersss

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Effectivement, il faut surement jouer avec les paramètres de précision.

    Je te conseille aussi de plotter/ calculer quelques valeurs de la fonction que tu minimises, histoire de voir si elle constante ou pas.

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