要求我使用最小二乘法拟合α
中的参数β
和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]
我的想法正确吗?
答案 0 :(得分:1)
我们要做的第一件事是在等式的两边取自然对数ln
(log
中的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