多阶函数最小二乘拟合

1.问题提出:

给出一堆数据,假设有n组(x,y),求一个k阶拟合,使拟合后的曲线,最接近给出的数据趋势,如下图公式(0)。

 2.解决方案:

这里给出三种拟合方案:

1)绝对值之和最小,见公式(1)。

2)差值平方和最小,见公式(2)。(即最小二乘拟合)。

3)使差值绝对值最大的数据值最小,见公式(3)。

多阶函数最小二乘拟合

3.最小二乘拟合

3.1 思想

多阶函数最小二乘拟合

ai求偏导,i=1~k。

多阶函数最小二乘拟合

整理之后:

多阶函数最小二乘拟合

以上范德蒙矩阵化简之后:

多阶函数最小二乘拟合


X*A=Y=>A=(inv(X'*X))*X'*Y;

由以上,即可以把拟合的系数定下来了。

切记,拟合的过程中,不能过拟合,也不能欠拟合。阶数,要根据实际情况拟定。


示例:

%%最小二乘模拟,
%%N阶
clc;clear;close all;
%%确定阶数
order=9;
x=-1:0.02:1;
i=1;
for a=-1:0.02:1
    y(i)=((a*a-1)*(a*a-1)*(a*a-1)+0.5)*sin(2*a);
    i=i+1;
end


% plot(x,y,'r-');
grid on;
%%%对曲线加噪
W=randn(length(x))/20;
for i=1:1:101
    y1(i)=y(i)+W(i);
end
hold on;
plot(x,y1,'b.')
legend('real','jiazao',-1);
%%plot(x,'g*')


%%%对曲线进行拟合
%%X*A=Y;A=[inv(X'*X)*X']*Y;
lenRow=length(x);
lenCol=order+1;
matrixX=zeros(lenRow,lenCol);


%%往matriX里面填 值
for i=1:1:lenRow
    for j=1:1:lenCol
        matXTemp=1;
        for k=j-1
            matXTemp=1*x(i)^k;
        end
        matrixX(i,j)=matXTemp;
    end
end


matrixY=y1';


%%solve A
matrixTemp1=matrixX'*matrixX;
invmatrixTemp=inv(matrixTemp1);
matrixATemp=invmatrixTemp*matrixX';
matrixA=matrixATemp*matrixY;


% matrixA=inv(matrixX'.*matrixX).*matrixX'.*matrixY;


matrixY0=zeros(1,length(y1));
for i=1:1:length(y1)
    matrixTemp=1;
    matrixY0(i)=0;
    for k=1:1:order+1
        matrixY0(i)=matrixY0(i)+matrixA(k)*x(i)^(k-1);
    end
end


%%

plot(a,matrixY0,'r-');


拟合结果对比:

多阶函数最小二乘拟合