在此示例中,导出最小二乘估计量是一个好主意。其他答案采用这种方法。
有一种快速而肮脏的方法,既灵活又方便。
只是数字而已。您可以使用fminsearch 来完成这项工作。
% MATLAB R2019a
x = [1 2 3 4 5 6 7];
y = [9 6 4 2 4 6 9];
% Create anonymous function (your supposed model to fit)
fh =@(params) params(1).*exp(-params(2).*x);
% Create anonymous function for Least Squares Error with single input
SSEh =@(params) sum((fh(params)-y).^2); % Sum of Squared Error (SSE)
p0 = [1 0.5]; % Initial guess for [alpha, beta]
[p, SSE] = fminsearch(SSEh,p0);
alpha = p(1); % 5.7143
beta = p(2); % 1.2366e-08 (AKA zero)
将结果绘制为健全性检查总是一个好主意(我经常搞砸,这一次又一次地节省了我)。
yhath=@(params,xval) params(1).*exp(-params(2).*xval);
Xrng = min(x)-1:.2:max(x)+1;
figure, hold on, box on
plot(Xrng,p(1).*exp(-p(2).*Xrng),'r--','DisplayName','Fit')
plot(x,y,'ks','DisplayName','Data')
legend('show')
关于非线性的说明:
由于convexity,这适用于线性模型。如果您的误差函数是非线性但凸的,如平方误差和 (SSE),那么这也会返回全局最优值。
请注意,非凸函数将需要多个起点来尝试捕获许多局部最优值,然后采用最好的一个仍然不能保证最优性。为解决方案添加约束将需要惩罚函数或切换到约束求解器,因为fminsearch 解决了无约束问题(除非您正确惩罚它)。
易于修改:
很容易修改模型和误差函数。例如,如果您想最小化绝对误差的总和,则可以直接使用abs。
% Create anonymous function for Least Absolute Error with single input
SAEh =@(params) sum(abs(fh(params)-y)); % Sum of Absolute Error