Verfasst am: 03.01.2019, 13:01
Titel: Regression erzeugen bei beschränktem Wachstum
Hallo,
ich möchte eine Regression erzeugen bei beschränktem Wachstum (quasi das "Gegenteil" von exponentieller Regression). Dazu habe ich schon bei Youtube eine für mich ganz brauchbare Erklärung gefunden:
https://www.youtube.com/watch?v=HPV2E8g5v6o
mit dem entsprechenden Code dazu:
https://sites.google.com/site/srcom.....l-curve-fitting-in-matlab
Das Beispiel funktionier auch bei mir. Allerdings möchte ich nun folgende Abwandlung vornehmen. Statt einem exponentiellen Wachstum soll nun ein beschränktes Wachstum vorliegen. D. h. die ersten beiden Zeilen werden wie folgt abgewandelt:
Code:
x = [0.01.02.03.04.0] ; % independent variable quantities
y = [3.55.56.57.07.25] ; % dependent variable quantities
An welcher Stelle muss der Code nun verändert werden, damit eine entsprechende Regression erstellt werden kann? Mir fehlt noch die richtige Idee wo da der Unterschied genau ist.
Der geamte Code:
Code:
x = [0.01.02.03.04.0] ; % independent variable quantities
y = [3.55.56.57.07.25] ; % dependent variable quantities
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Letztere Idee fand ich sehr gut. Die Rgression läuft auch schon. Allerdings kommt hier wieder eine Exponentialfunktion heraus. Dabei ist doch folgendes
A = bestx(1);
lambda = bestx(2);
yfit = A*exp(-lambda*xx);
f8 =figure(8);
plot(xx,yy,'*');
hold on
plot(xx,yfit,'r');
xlabel('tdata') ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') hold off
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ich mag Formeln immer lieber... wer was mit welchen Begriffen genau meint...
Problem ist, dass du die jetzt verlinkte Formel verwendet hast. Die enthält insbesondere drei Parameter, du verwendest nur zwei.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Und ich dachte ein Bild sagt mehr als tausend Worte
Ja was ich habe ist nur "normales" exponentielles Wachstum.
A*e^(-lambda*t)
Für begrenztes Wachstum muss ich irgendwie noch eine Schranke errechnen. Der Anfangswert sollte ja ebenfalls "A" sein und sich nicht verändern.
beschränktes Wachstum: S-(S-B0)*exp(-lambda*t)
wobei: S = Schranke und B0 = Startwert (= A?)
wenn ich das richtig verstehe, willst du S-(S-B0)*exp(-lambda*t) mit vorgegebenem S verwenden. Dieses S muss aber dann natürlich in die Gleichung rein.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ja das ist so schon von der Idee her wie ich mir das vorgestellt habe. Jedoch ist mir S noch unbekannt.
Ich habe nochmal etwas weiter recherchiert und folgendermaßen habe ich das Problem gelöst.
Code:
clc clear closeall %
x = [0.01.02.03.04.0]' ; % independent variable quantities
y = [3.55.56.57.07.25]' ; % dependent variable quantities %
g = fittype('a-(a-b)*exp(-c*x)','dependent',{'y'},'independent',{'x'},'coefficients',{'a','b','c'})
So schaut das Ergebnis zumindest optisch so aus wie ich es gerne hätte. Für mich als Anfänger kommt das so auch irgendwie einfacher vor. Gibt es da jetzt einen Qualitätsnachteil den ich ggf. übersehen habe? Bzw. was hältst du von dieser Lösung?
Sorge bereitet mir auch noch, dass der Startpunkt zufällig ist. Dadurch ist die Regression nicht immer gleich. Manchmal erscheit eine lineare Funktion (zumindest scheint es so auszuschauen).
Code:
Warning: Start point not provided, choosing random start point.
> In curvefit.attention.Warning/throw (line30)
In fit>iFit (line299)
In fit(line108)
In regress_test_20190103d (line21)
Wenn man auch nur im geringsten ein Gefühl für die Startwerte hat, sollte man welche angeben. Du weißt ja z.B. vermutlich, in welcher Größenordnung die Schranke ist oder auch dass c negativ sein muss, aber meist betragsmäßig relativ klein.
Der fminsearch-Ansatz minimiert die Summe der quadrierten Abweichungen per Direktsuche. Der Algorithmus sieht quasi nur einen gut-schlecht - Wert.
Tendentiell besser ist dein neuer Ansatz oder eben das von mir empfohlene fitnlm. Da wird nämlich direkt ein Least-Squares-Algorithmus verwendet.
Alle Methoden suchen nach einem lokalen Minimum, das nicht das globale sein muss. Wenn also kein ausreichend guter Startwert bekannt ist, kann man selbst über mehrere Startwerte iterieren oder die Global Optimization Toolbox verwenden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
g = fittype('a-(a-b)*exp(-c*x)','dependent',{'y'},'independent',{'x'},'coefficients',{'a','b','c'},'options',options)
f = fit(x,y,g) plot(f,x,y)
v=coeffvalues(f)
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.