最小二乘法拟合参数

时间:2018-12-05 19:00:22

标签: matlab least-squares non-linear-regression

要求我使用最小二乘法拟合α中的参数βy = α*exp(-β*x)

给出要点:

x = [1 2 3 4 5 6 7]
y = [9 6 4 2 4 6 9]

我在确定矩阵外观时遇到麻烦。我知道我应该取函数两边的自然对数以去除指数,并获得y值的自然对数,即:

ln_y = [2.19 1.79 1.39 0.69 1.39 1.79 2.19]

但是我的矩阵应该是什么样子,因为剩下的就是 ln(y) = ln(α) - β*x

所以列由1组成,而x列将是我的x值,但是α列应包含什么?

这就是我应该得到的:

A = [1 1 1 1 1 1 1; 1 2 3 4 5 6 7]

我的想法正确吗?

3 个答案:

答案 0 :(得分:1)

我们要做的第一件事是在等式的两边取自然对数lnlog中的Matlab):

y = α * e^(-β * x)

成为:

ln(y) = ln(α * e^(-β * x))
// Law of logarithms
ln(x * y) = ln(x) + ln(y) 

// thus:
ln(y) = ln(α) + ln(e^(-β * x))
Simplifying:
ln(y) = -β * x + ln(α)

现在我们有了ln(y)作为x的线性函数,这个问题减少到找到最小二乘意义上的线性回归。让我们定义lny = log(y)A = ln(α),我们可以将问题重写为

lny = -β * x + A

哪里

x = [1 2 3 4 5 6 7]
lny = [2.19 1.79 1.39 0.69 1.39 1.79 2.19]

对于x中的每个x_i,我们可以按以下方式评估lny(以x的升序形式重写):

lny(x1) = A - β * x1
lny(x2) = A - β * x2
...
lny(xn) = A - β * xn

矩阵形式

LNY = X * [A β]'
Or,
X * [A β]' = LNY
// let Coefs = [A β]'
Coefs = X^-1 * LNY

在Matlab中

x = [1 2 3 4 5 6 7];
y = [9 6 4 2 4 6 9];
lny = log(y);
X = [ones(length(y), 1), -x']; % design matrix
coefs = X\lny'
% A = coefs(1) and β = coefs(2)
% ln(α) = A thus α = exp(A)
alpha = exp(coefs(1));
beta = coefs(2)

答案 1 :(得分:1)

您几乎拥有了它。第二行应为-x

x = [1 2 3 4 5 6 7]
y = [9 6 4 2 4 6 9]

logy = log(y)

n = length(x);
A = [ones(1,n); -x]

c = logy/A; %Solve for coefficients

alpha = exp(c(1))
beta = c(2);

答案 2 :(得分:0)

在此示例中,推导最小二乘估计是一个好主意。其他答案采用这种方法。

有一种快速而肮脏的方法,它既灵活又方便。

只需数字即可。您可以使用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