Mercurial > hg > ltpda
diff m-toolbox/test/LTPDA_training/topic5/TrainigSession_T5_Ex05.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/test/LTPDA_training/topic5/TrainigSession_T5_Ex05.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,186 @@ +% Training session Topic 5 exercise 05 +% +% Fitting time series with xfit +% +% ao/xfit uses a full non-linear least square algorithm to fit data. Here +% the main features will be described to fit an up-chirp sine. +% +% 1) Load time series data +% 2) Define the model to fit +% 3) Inspect data in order to find an initial guess +% 4) Fit data with ao/xfit starting from that guess +% 5) Check results +% 6) Fit again by changing the fitting algorithm (fminunc will be used) +% 7) Check results +% 8) Fit again by using a Monte Carlo search +% 9) Check results +% 10) Final fit with the full model (data bias included) +% 11) Check results +% 12) Comments +% +% Trento, 01-03-2010 +% Giuseppe Congedo +% +% $Id: TrainigSession_T5_Ex05.m,v 1.3 2011/05/13 15:13:12 ingo Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% 1) load tsdata + +% load test noise AO from file +data = ao(plist('filename', 'topic5/T5_Ex05_TestNoise.xml')); +data.setName; + +% look at data +iplot(data) +% iplot(abs(fft(data))) +% iplot(psd(data)) + +%% 2) set the model + +% try a linearly chirped sine wave with a bias +mdl = smodel('a + P1.*sin(2.*pi.*(P2 + P3.*t).*t + P4)'); +mdl.setParams({'a', 'P1', 'P2', 'P3', 'P4'}); +mdl.setXvar('t'); +mdl.subs('a',5); % set additional parameters - data bias + +%% 3) try to find an initial guess + +% plot the tentative model +mdlTry = mdl.setValues([4 1e-4 1e-5 0]); +mdlTry.setXvals(data.x); +iplot(data,mdlTry.eval) + +%% 4) xfit from an initial guess + +% fit plist +plfit = plist('Function', mdl, ... + 'P0', [4 1e-4 1e-5 0], ... % set initial guess for the parameters + 'LB', [2 1e-6 1e-6 0], ... % set lower bounds for parameters + 'UB', [5 1e-2 1e-2 2*pi] ... % set upper bounds for parameters + ); + +% do fit +params = xfit(data, plfit) + +%% 5) check results + +bestMdl = eval(params); + +% plotting results +iplot(data,bestMdl) +iplot(data-bestMdl) +iplot(psd(data-bestMdl)) + +% Comments. +% Fit is not so bad, but let's now try to change the fitting algorithm. + +%% 6) xfit from an initial guess (change algorithm) + +% fit plist +plfit = plist('Function', mdl, ... + 'P0', [4 1e-4 1e-5 0], ... % set initial guess for the parameters + 'LB', [2 1e-6 1e-6 0], ... % set lower bounds for parameters + 'UB', [5 1e-2 1e-2 2*pi], ... % set upper bounds for parameters + 'algorithm', 'fminunc'); % set fitting algorithm + +% do fit +params = xfit(data, plfit) + +%% 7) check results + +bestMdl = eval(params); + +% plotting results +iplot(data,bestMdl) +iplot(data-bestMdl) +iplot(psd(data-bestMdl)) + +% Comments. +% Fit is not so bad: an improvement with respect to using fminsearch. +% Let's now try to do a Monte Carlo search. + +%% 8) xfit from a Monte Carlo search (bounds are shrinked about the best-fit found above) + +% fit plist +plfit = plist('Function', mdl, ... + 'LB', [2.5 1e-5 1e-6 0], ... % set lower bounds for parameters + 'UB', [3.5 1e-3 1e-4 2*pi], ... % set upper bounds for parameters + 'algorithm', 'fminunc', ... % set fitting algorithm + 'MonteCarlo', 'y', 'Npoints', 1e4); % set the number of points in the parameter space + +% do fit +params = xfit(data, plfit) + +%% 9) check results + +bestMdl = eval(params); + +% plotting results +iplot(data,bestMdl) +iplot(data-bestMdl) +iplot(psd(data-bestMdl)) + +% Comments. +% Fit is not so bad: no further improvements with respect to the previous fit. +% Let's now try to fit the full model by doing a Monte Carlo search. + +%% 10) xfit with full model + +% set the full model (including the data bias) +mdl = smodel('a + P1.*sin(2.*pi.*(P2 + P3.*t).*t + P4)'); +mdl.setParams({'a', 'P1', 'P2', 'P3', 'P4'}); +mdl.setXvar('t'); + +% fit plist +plfit = plist('Function', mdl, ... + 'P0', [5 3.01 7.27e-5 1.00e-5 0.325], ... % set initial guess for the parameters + 'LB', [4 2.5 1e-5 1e-6 0], ... % set lower bounds for parameters + 'UB', [6 3.5 1e-3 1e-4 2*pi], ... % set upper bounds for parameters + 'algorithm', 'fminunc' ... % set fitting algorithm + ); + +% do fit +params = xfit(data, plfit) + +%% 11) check results + +bestMdl = eval(params); + +% plotting results +iplot(data,bestMdl) +iplot(data-bestMdl) +iplot(psd(data-bestMdl)) + +% Comments. +% Fit is good, even for the full model (including bias). + +%% 12) Comments + +% Let's compare the fit results with the real parameters. +% +% Firstly, data were generated with the set of parameters: +% a = 5 +% P1 = 3 +% P2 = 1e-4 +% P3 = 1e-5 +% P4 = 0.3 +% +% In the end, the fit results are +% chi2 = 1.03 +% dof = 995 +% a = 4.965 +/- 0.033 +% P1 = 3.018 +/- 0.047 +% P2 = 6.6e-5 +/- 3.1e-5 +% P3 = 1.0032e-5 +/- 3.1e-8 +% P4 = 0.334 +/- 0.043 +% Quite in well accordance with expected values! +% +% Are they biased? No, they are not. Indeed: +% (p_fit - p_true)/dp = ... +% 1.1 +% 0.39 +% 1.1 +% 1.1 +% 0.80 +% Very good.