How to fit a log curve to a scatterplot?

31 visualizzazioni (ultimi 30 giorni)
Louise Wilson
Louise Wilson il 28 Mag 2021
Commentato: Star Strider il 31 Mag 2021
Could anyone advise me on how to a fit a curve to this plot?
The y-axis is decibels and so logarithmic.
I have tried the help page of lsqcurvefit but clearly using the wrong inputs as the curve doesn't align with the points.
x=slopeDist; %18 distances in km
y=PSD; %18 dB values from 50-90
scatter(x,y)
p = polyfit(x,y,1);
f = polyval(p,x);
plot(x,y,'o',x,f,'-')
legend('data','linear fit')
%fits a line but we want a curve!
%Log curve? Doesn't work...
fun = @(x,xdata)x(1)*exp(x(2)*xdata);
x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')
  1 Commento
Walter Roberson
Walter Roberson il 31 Mag 2021
I tried your data using cftool. All of the models produced fairly bad fits, except for the piecewise interpolations (such a cubic spline), unless you go for something like an 8 term fourier (each term has two coefficients, so 2*8 = 16 coefficients, and you only have 17 datapoints, so it is not surprising you can get something pretty close. But it is also useless, taking wild swings.)

Accedi per commentare.

Risposte (1)

Star Strider
Star Strider il 28 Mag 2021
Modificato: Star Strider il 28 Mag 2021
If you have the Statistics and Machine Learning Toolbox, use the lsline funciton.
Otherwise use polyfit and polyval.
x = 1:10;
y = 10.^(-x/20) + randn(size(x))/10;
figure
scatter(x, mag2db(y), 'p')
grid
lsline
EDIT — Added plot.
.
  6 Commenti
Louise Wilson
Louise Wilson il 31 Mag 2021
Thanks. The reason I have a straight line regression is because that's all I know how to do. The data hasn't changed. I have tried with polyfit too but it produces the same output, a straight line.
p = polyfit(xdata,ydata,1);
f = polyval(p,xdata);
plot(xdata,ydata,'o',xdata,f,'-')
legend('data','linear fit')
Star Strider
Star Strider il 31 Mag 2021
This is the best I can do —
LD = load('data.mat');
outsort = sortrows(LD.out); % Not Sorting The Rows Creates Problems For The Regression
x = outsort(:,1);
y = outsort(:,2);
fcn = @(b,x) b(1).*exp(b(2).*x) + b(3);
B = fminsearch(@(b)norm(fcn(b,x)-y), [90; 0.001; 60] );
yfit = fcn(B,x);
expstr = @(x) [x(:).*10.^ceil(-log10(abs(x(:)+(x==0)))) floor(log10(abs(x(:)+(x==0))))];
figure
scatter(x, y)
hold on
plot(x, yfit, '-r')
hold off
grid
text(2.5E+5, 77.5, sprintf('$y = %.1f\\ e^{%.1f\\times 10^{%d} \\ x} +%.1f$',B(1),expstr(B(2)),B(3)), 'Interpreter','latex', 'FontSize',15);
I added the equation for the regression. Remove that if it is not necessary. (The ‘expstr’ function generates the matissa and exponent from ‘B(2)’ here. It looks better than displaying all the leading zeros in the regression equation. If you do not want to display the regression equation, the function is not otherwise necessary for the code.)
.

Accedi per commentare.

Categorie

Scopri di più su Get Started with Curve Fitting Toolbox in Help Center e File Exchange

Prodotti


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by