WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

lsqcurvefit (optimization tb), falsche Fitarameter berechnet

 

TinaFuhrmann
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 13.11.2015, 13:42     Titel: lsqcurvefit (optimization tb), falsche Fitarameter berechnet
  Antworten mit Zitat      
Hallo,

zur Auswertung meiner Messdaten habe ich einen least squares curve fit (optimization toolbox, MATLAB 2014b) für eine sigmoidale Funktion programmiert, in den Schätzungen der 4 Fitparameter sowie untere und obere Grenzen eingehen (siehe Minimalbeispiel unten).
Er funktioniert für die meisten meiner Daten sehr gut, bei den untenstehenden gibt es allerdings ein Problem bei dem ich nicht weiß, wo es herkommt.

Zum fit nutze ich bei x und y normalerweise nicht die letzten 25 Werte, weil diese durch die Vorverarbeitung etc. zu unsicher sind. In diesem Fall funktioniert der Fit aber nur richtig mit den letzten Werten, nicht aber ohne sie, was ich mir nicht erklären kann, weil er dann offensichtlich falsch wird. Deshalb hier die Fragen:
- Woran liegt er offensichtlich fehlerhafte fit? (ohne die letzten 25 Werte erhalte ich für fitPara(4) 2.1198 und mit 0.3067)
- was könnte ich tun? Die letzten 25 mit einbeziehen ist keine Option, weil dann viele andere Messungen wieder nicht richtig gefittet werden.

Vielen Dank!
Tina.

Code:

%% data
   x = [97;193;289;385;481;577;673;769;865;961;1057;1153;1249;1345;1441;1537;1633;1729;1825;1921;2017;2113;2209;2305;2401;2497;2593;2689;2785;2881;2977;3073;3169;3265;3361;3457;3553;3649;3745;3841;3937;4033;4129;4225;4321;4417;4513;4609;4705;4801;4897;4993;5089;5185;5281;5377;5473;5569;5665;5761;5857;5953;6049;6145;6241;6337;6433;6529;6625;6721;6817;6913;7009;7105;7201;7297;7393;7489;7585;7681;7777;7873;7969;8065;8161;8257;8353;8449;8545;8641;8737;8833;8929;9025;9121;9217;9313;9409;9505;9601;9697;9793;9889;9985;10081;10177;10273;10369;10465;10561;10657;10753;10849;10945;11041;11137;11233;11329;11425;11521;11617;11713;11809;11905;12001;12097;12193;12289;12385;12481;12577;12673;12769;12865;12961;13057;13153;13249;13345;13441;13537;13633;13729;13825;13921;14017;14113;14209;14305;14401;14497;14593;14689;14785;14881;14977;15073;15169;15265;15361;15457;15553;15649;15745;15841;15937;16033;16129;16225;16321];
    y = [0.187886389862475;0.203311034201581;0.203984709964503;0.205800020868461;0.210358393118755;0.210482343003140;0.210514938575809;0.210514938575809;0.210784094502403;0.225572386685634;0.227751261173721;0.230174226638257;0.230174226638257;0.230174226638257;0.231691209904021;0.240923186529838;0.241263621899458;0.241263621899458;0.241263621899458;0.241263621899458;0.240923186529838;0.240923186529838;0.245052509947511;0.246012352541460;0.246012352541460;0.247154611383149;0.247154611383149;0.247154611383149;0.247154611383149;0.247154611383149;0.247154611383149;0.256734122317185;0.262043920333909;0.267729318955608;0.271099199917582;0.271099199917582;0.271099199917582;0.271099199917582;0.274352366081140;0.283001470828324;0.283001470828324;0.283001470828324;0.284358460003337;0.285583177539372;0.288344819364919;0.291736927808440;0.296252136650969;0.298471095112088;0.305790521051112;0.306151154148525;0.320486536540151;0.326004723414062;0.341498333645373;0.341779225727664;0.342339333627146;0.342348611673622;0.342498752179251;0.383329806670453;0.383525242427708;0.400810371626882;0.403933338948747;0.404319680253985;0.451513208114040;0.507514209376854;0.513355492051606;0.521127610259588;0.532713205500346;0.548773712643539;0.601821870163293;0.629083071181099;0.758012325924453;0.793447496670962;0.872651528811510;0.954657302357645;1.00881261003084;1.06882790541970;1.22574877461128;1.24801838836576;1.31245955976634;1.49037004442543;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;1.50000000000000;2.50000000000000;2.50000000000000;3.45371198995839;3.58911654883286;3.76715855310216;3.76833985781978;3.87364110178313;3.87364110178313;3.89287314665671;3.89750047823715;3.89750047823715;3.92404331619192;3.95924623912447;3.97068148461191;3.98295964962051;3.98295964962051;3.98487813683979;3.98487813683979;3.98487813683979;4.05053798241411;4.09465455040359;4.09953000037644;4.11567612915588;4.11567612915588;4.11567612915588;4.11567612915588;4.11567612915588;4.13252433656479;4.13949919644280;4.14005708301247;4.16106162573884;4.22470559768594;4.33699453895528;4.33699453895528;4.33699453895528;4.33699453895528;4.33699453895528;4.22470559768594;4.20360674020652;4.20360674020652;4.20360674020652;4.20360674020652;4.12436705603018;4.12436705603018;4.12436705603018;4.14024851232621;4.20360674020652;4.21257512124744;4.29473147499744;4.29473147499744;4.29473147499744;4.29079611170303;4.18501770122792;4.18501770122792;4.18501770122792;4.23907666209938;4.23907666209938;4.18501770122792;4.05095099308096;4.04533947735520;4.04533947735520;4.04533947735520;4.04533947735520;4.05095099308096;4.05095099308096;4.05095099308096;3.96970179019042;3.94295126486754;4.32946838950045;3.92332075596656;3.78510515236097];


%% predefine fit with optimization toolbox
   % define fit function
      sigFitFunction = @(fitPara,lineIndex)...
         (fitPara(1)./(1+exp(-fitPara(2)*(lineIndex-fitPara(3))))+fitPara(4));
   % set random number generator
      rng('default')
   % create optimization fitting options % optimization toolbox
      opts = optimset('lsqcurvefit');
      opts.Display = 'off';

%% predefine fit parameters
      % define fit parameter
         guess(1)=mean(y(end-31:end-21));
         guess(2)=0.005;  
         guess(3)=x((end)/2);
         guess(4)=0.0;
      % fit parameter lower bounds
         lb(1)=min(y);
         lb(2)=-0.015;  
         lb(3)=x(1);
         lb(4)=min(y);
      % fit parameter upper bounds
         ub(1)=max(y);
         ub(2)=0.015;  
         ub(3)=x(end);
         ub(4)=max(y);        

%% fit
   x = x(1:end-25);
   y = y(1:end-25);

   [fitPara,~,residual,~,~,~,J] = lsqcurvefit(...
      sigFitFunction,guess,...
      x,y,...
      lb,ub,opts);

%% control result
   dataFitted=fitPara(1)./(1+exp(-fitPara(2)*(double(x)-fitPara(3))))+fitPara(4);
   dataGuess=guess(1)./(1+exp(-guess(2)*...
      (double(x)-guess(3))))+guess(4);
   plot(x,[y,dataFitted,dataGuess],'-*')
   legend('data','fit','guess')

 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2015, 14:02     Titel:
  Antworten mit Zitat      
Hallo,

du hast es geschafft, durch Ausschalten von 'Display' und Ignorieren des Exitflag-Rückgabearguments jegliche Selbstdiagnose von lsqcurvefit auszuschalten.
Wenn du das ausgeben lässt, siehst du, dass lsqcurvefit vorzeitig abbricht. Anzahl der Funktionsauswertungen und Iterationen erhöhen, und schon sieht es deutlich besser aus:
Code:
    opts = optimset('lsqcurvefit');
      opts.MaxFunEvals = 4000;
      opts.MaxIter = 4000;


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TinaFuhrmann
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 13.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 13.11.2015, 14:14     Titel:
  Antworten mit Zitat      
Vielen Dank!
Daran hatte ich gerade gar nicht mehr gedacht, dass ich die Iterationen hochsetzen könnte.

Das Problem mit den Warnungen ist, dass ich viele tausend fits mit unterschiedlich viel Rauschen mache und mir die Ausgabe nicht mit der Warnung
"Local minimum possible
lsqcurvefit stopped because the final change in the sum of squares relative to its initial value is less than the selected value of the function tolerance.
<stopping criteria details>"
zumüllen wollte. Bei der Fehlersuche hätte ich natürlich mal dran denken können, die Anzeige wieder anzuschalten.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2015, 14:17     Titel:
  Antworten mit Zitat      
Hallo,

wenn lsqcurvefit in einer Schleife ausgeführt wird, würde ich mir dennoch die exitflag zurückholen und festhalten, welche der Ergebnisse aufgrund einer nichtpositiven exitflag vermutlich unbrauchbar sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.