最小二乘假设函数的形式

时间:2018-08-06 16:35:01

标签: matlab least-squares

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

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

我正在尝试使用另一种方法,即通过使用可调参数(例如x(beta,a,c))来假定xβ的功能形式。如何在MATLAB中为这些参数的最小二乘解解决此问题?

2 个答案:

答案 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^0x^1的系数都取决于其他任意参数a(在此示例中a = 6-就是我们正在尝试从数据中恢复)。

constrainedQuadFitting

这里列出了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