Why MATLAB gives very bad fitting parameters?
15 次查看(过去 30 天)
显示 更早的评论
Why MATLAB gives very bad fitting parameters when fittype and fit are used together. Below is the one example where I have a 3D matrix ( Auto) and in which I am fitting the Auto(p,q,:) elements using a for a loop. I am calculating one parameter ( D(p,q)=fit1.D) from the fitting. Sometimes I used catch and try to avoid the breakdown of the loop.
However, the point is that I think MATLAB is not efficient in curve fitting. I used ( Origin) which gave nice good fitting but the same data and the same equation does not give me expected parameters in MATLAB. I could use the curve fitting toolbox but I want to recursively fit the data and want to extract parameters in a loop which refrain me for using the toolbox.
clear all; close all; clc;
load('Auto.mat');
l2= size(Auto);
for p=1:l2(1)
for q=1:l2(2)
% This is part for the data which has values less than 0.6 in the
% first two matrix in the AutoX3 matrix
y=reshape(Auto(p,q,1:end),[],1);
if y(1,:)<0.6 || y(2,:)<0.55
y(:,:)=NaN;
end
x=(0:0.5:(length(y)-1)*0.5)'; % The X-axis
% The fitting equation %
f = fittype('(A./(sqrt(1+ ((x*D)./(0.16.^2)))))');
% Try and catch to successfully continue the loop%
try
fit1 = fit(x,y,f,'StartPoint',[0.1 0.1]);
RateCons(p,q)=fit1.D;
Amplitude(p,q)=fit1.A;
catch
RateCons(p,q)=NaN;
Amplitude(p,q)=NaN;
end
end
end
7 个评论
Walter Roberson
2018-7-21
For example, at p=32, q=33, then A and D are determined by fit to be 0.929878332309704, 0.00491910153972962 . When I convert the residue formula into symbolic form using rationals instead of floating point numbers, and use a symbolic package to minimize, I get .929869232279317, 0.00491889395158922 as the global best, which differ in positions from fit's results by about 1E-5 and 2E-7 respectively.
But the exact best position is subject to numeric roundoff problems, and working numerically in MATLAB I get slightly better residue at 0.929869232278125901, 0.00491889395270517921. We are talking about differences in residue on the order of 4E-17 .
The overall residue surfaces have a fairly consistent shape of being more or less a tilted parabola sheet outside the major basin of attraction; any minimizer that looked at the gradient would get centered towards the middle of the parabola pretty quickly, and would follow that line into the major basin of attraction. The basin of attraction is then an obvious paraboloid, so a gradient following minimizer would get pulled to a small distance from the global minima residue in a small number of iterations.
In the locations I tested, I saw no evidence at all of any important local minima: there was no competing minima that a reasonable algorithm might accidentally get caught in.
Which is not to say that fit() is immune to having problems with competing local minima: it does, and there have been a few cases discussed in the last month or so where fit could reasonably accidentally get stuck in the wrong minima, especially cases involving sum of exponentials. fit can end up with a pretty high confidence that it has found the right parameters, and yet be wrong because the other better set of parameters might be difficult to get close to. But this function is not one of those cases: there is an unambiguous area of global minima and in each trial with your data that I investigated, fit() got close to it without difficulty.
采纳的回答
Walter Roberson
2018-7-21
%clear all; close all; clc;
load('Auto.mat');
%arbitrary constant as part of the equation. I do not know where it comes from
C = 0.16^2;
l2= size(Auto);
RateCons = NaN(l2(1), l2(2));
Amplitude = NaN(l2(1), l2(2));
x=(0:0.5:(l2(3)-1)*0.5)'; % The X-axis
LBA = -inf;
LBD = -C/x(end); %below this, the calculation goes complex
UBA = inf;
UBD = inf;
LB = [LBA, LBD];
UB = [UBA, UBD];
% The fitting equation %
f = fittype(@(A,D,x) (A./(sqrt(1+ ((x*D)./C)))));
opts = fitoptions(f);
opts.Lower = LB;
opts.Upper = UB;
opts.StartPoint = [0.1 0.1];
for p=1:l2(1)
for q=1:l2(2)
% This is part for the data which has values less than 0.6 in the
% first two matrix in the AutoX3 matrix
y=reshape(Auto(p,q,1:end),[],1);
if any(isnan(y(:))) || y(1,:)<0.6 || y(2,:)<0.55
%we used to assign NaN here, but now we initialize everything to NaN
else
% Try and catch to successfully continue the loop%
try
fit1 = fit(x,y,f,opts);
RateCons(p,q)=fit1.D;
Amplitude(p,q)=fit1.A;
catch ME
%we used to assign NaN here, but now we initialize everything to NaN
end
end
end
end
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Get Started with Curve Fitting Toolbox 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!