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);
%% 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')
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:
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.
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
Einstellungen und Berechtigungen
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
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.