最小二乘假设解的函数形式

Least squares assuming functional form of the solution

我正在尝试解决以下最小二乘问题:

b(alpha)=A(alpha,beta)x(beta)

我正在尝试使用另一种方法,即通过使用可调参数假设 x(beta) 的函数形式,比如 x(beta, a, c)。我如何在 MATLAB 中解决这个问题以获得这些参数的最小二乘法?

如果不知道参数的确切工作原理,就很难弄清楚该怎么做。例如如果参数是

x(beta, a, c) = a * x(beta) + c

那么你的等式就变成了

b(alpha)= A(alpha,beta) * (a * x(beta) + c)
b(alpha) - c*A(alpha,beta) = A(alpha,beta) * a * x(beta)

然后也许你可以用标准的方式解决(我把 b 和 A 当作数字,把 x 作为这里唯一的变量,忽略 alpha 和 beta)。对于更多的非线性关系,它变得复杂。

我支持评论 - 如果您对问题的描述稍微详细一些,并且最重要的是添加一个最小的工作示例,这会容易得多。

不过据我了解,你想解决一个 linear system of equations with some additional assumptions about the fitted parameters. This can be done by expressing them as an optimisation problem.

例如,我在这里拟合了一个二次方程式,其中 x^0x^1 的系数都取决于其他一些任意参数 a(对于本例 a = 6 -这就是我们试图从数据中恢复的内容。

这里绘制了 2 种不同的方法 - 无约束和约束优化。您可以看到它们都很好地逼近了我们的数据,但只有约束优化恢复了接近 6 (5.728) 的值。无论如何,看看代码,我希望这对您的问题有所帮助。如果可以,请尝试使用减少参数数量的方法。如果可能,最好将拟合问题减少到较低维空间 - 局部最小值的风险更小,解决方案更快。

代码如下:

close all; clear; clc;

%% Generate test data
x = 1:100;

rng(0); % Seed rng

% Polynomial where we know something about the parameters - we know that if
% the coefficient of x^0 is 'a'm then the coefficient of x^1 is (1-a).
a = 6;
y = a + (1-a).*x + 0.1*x.^2;
y = y + 30*randn(size(x)); % Add some noise

%% Fit with mrdivide and Vandermonde matrix 
A = vander(x); A = A(:,end-2:end)';
b = y;
k1 = b/A;

%% Fit with an unconstrained optimiser
f = @(k) optimfun1(x,y,k);
k0 = [1 1 1]; % Starting point
k2 = fminsearch(f,k0);

%% Fit with a constrained optimiser
f = @(k) optimfun1(x,y,k);
k0 = [1 1 1]; 
Aeq = [0 1 1]; beq = 1; % Constrain k2 = 1 - k3 which is equivalent to k2+k3 = 1
k3 = fmincon(f,k0,[],[],Aeq,beq);

%% Fit with a reduced number of parameters
f = @(k) optimfun2(x,y,k);
k0 = [1 1]; 
k4 = fminsearch(f,k0);
k4 = [k4 1-k4(2)]; % Infer the last coeff.

%% Plot
plot(x,y,'ko');
hold on
plot(x,polyval(k1,x));
plot(x,polyval(k2,x));
plot(x,polyval(k3,x));
plot(x,polyval(k4,x));
legend('k^{dat} = [6.000 -5.000 0.100];',...
    sprintf('k^{unc}_1 = [%.3f %.3f %.3f]',flipud(k1(:))),...
    sprintf('k^{unc}_2 = [%.3f %.3f %.3f]',flipud(k2(:))),...
    sprintf('k^{cns}_1 = [%.3f %.3f %.3f]',flipud(k3(:))),...
    sprintf('k^{cns}_2 = [%.3f %.3f %.3f]',flipud(k4(:))),...
    'location','northwest');
grid on;
xlabel('x');
ylabel('f(x)');
title(sprintf('f(x) = a + (1-a)x + 0.1x^2; a = %d',a));

function diff = optimfun1(x,y,k)
yfit = polyval(k,x);
dy = yfit-y;
diff = sum(dy.^2); % Sum of squared residuals
end

function diff = optimfun2(x,y,k)
k = [k 1-k(2)]; % Infer the last coeff.
yfit = polyval(k,x);
dy = yfit-y;
diff = sum(dy.^2);
end