help-octave
[Top][All Lists]

## Re: HELP please, Can't fit data properly

 From: Julien Bect Subject: Re: HELP please, Can't fit data properly Date: Thu, 4 Oct 2018 09:26:03 +0200 User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0

 Le 04/10/2018 à 01:11, Doug Stewart a écrit : On Wed, Oct 3, 2018 at 6:19 PM Przemek Klosowski wrote: On 10/03/2018 05:15 PM, Doug Stewart wrote: On Wed, Oct 3, 2018 at 4:25 PM James Sherman Jr. wrote: On Wed, Oct 3, 2018 at 4:07 PM T.G.ALG wrote: Hi, I'm trying to fit some data to a function of degree 4 or 5, but when I plot it, it doesn't fit: DATA: C30 =    0.063330   0.057200   0.052870   0.047380   0.044860   0.039710  0.037070   0.036030   0.034990 t =     1.0000    1.5000    2.0000    3.0000    5.0000    7.0000   10.0000  13.0000   18.0000 FIT: p=polyfit(t,C30,4)    0.0000027990  -0.0001193780   0.0018221783  -0.0125401220   0.0727802050 The problem is that when I plot(t,C30) and plot(p) I get totally different curves, am I missing somethiing??? Yes, I believe it is safe to say that you are missing something.  Look at vector that is returned from polyfit that you print out: p=    0.0000027990  -0.0001193780   0.0018221783  -0.0125401220   0.0727802050 these are the coefficients of the polynomial (see help polyfit for more explanation).  And the "curve" from plotting that vector is just the coefficients wrt their index.  The function you're probably looking for is polyval (help polyval for info) so that you can evaluate the fitted curve at the values of x that you want. Hope this helps, James Sherman Jr. Polyfit can do that [P, S] = polyfit (X, Y, N) S.yf  should have the fitted Y values for your x values. True, but it does not show how bad the fit is. These datapoints aren't likely to fit a polynomial model, and to see it it helps to see the actual fitted polynomial with more resolution than the 9 points provided: C30 = [ 0.063330   0.057200   0.052870   0.047380   0.044860   0.039710  0.037070   0.036030   0.034990] t      = [ 1.0000      1.5000       2.0000       3.0000      5.0000       7.0000    10.0000     13.0000     18.0000] plot(t,C30,'o',x=1:.1:20,polyval(polyfit(t,C30,4),x)) which shows nicely the deficiency of the fourth-order polynomial, by creating artifacts where the data has none. Depending on what you're actually trying to do with your data, non-parametric regression might be a suitable alternative. Here is a solution using kriging (a.k.a. Gaussian process regression) : ``` pkg load stk  % assuming stk installed C30 = [ 0.06333  0.0572  0.05287  0.04738  0.04486  0.03971   0.03707   0.03603   0.03499]'; t   = [ 1.0000   1.5000  2.00000  3.00000  5.00000  7.00000  10.00000  13.00000  18.00000]'; model = stk_model (@stk_materncov52_iso); model.lognoisevariance = nan;  % assume noisy data [model.param, model.lognoisevariance] = stk_param_estim (model, t, C30); t_box = stk_hrect ([0; 20], {'t'}); t_pred = stk_sampling_regulargrid (100, [], t_box); C30_pred = stk_predict (model, t, C30, t_pred); stk_plot1d (t, C30, t_pred, [], C30_pred);  legend show ``` See attached figure for the result. @++ Julien kriging.eps
Description: image/eps