我正在尝试解决以下最小二乘问题:
b(alpha)= A(alpha,beta)x(beta)
我正在尝试使用另一种方法,即通过使用可调参数(例如x(beta,a,c))来假定xβ的功能形式。如何在MATLAB中为这些参数的最小二乘解解决此问题?
答案 0 :(得分:0)
在不确切知道参数如何工作的情况下,很难弄清楚该怎么做。例如,如果参数为
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)。要获得更多的非线性关系,它会变得复杂。
答案 1 :(得分:0)
我第二点评论-如果您对问题进行更详细的描述,并且最重要的是添加一个最小的工作示例,这会容易得多。
据我了解,您想使用关于拟合参数的其他一些假设来解决linear system of equations。可以将它们表示为an optimisation problem。
例如,在这里我拟合了一个二次项,其中x^0
和x^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