天天看点

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

最小二乘法

原文链接:原创,转载请标明出处!

最小二乘法:

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

已知四个数据点,寻找一条直线(曲线),使得每个点与线的距离的总合最小。

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

使损失函数Q最小,得到参数β0,β1,对这个两个参数求偏导数

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

复现了下面文章中最小二乘法的不同类型的拟合方法

文章链接: https://wenku.baidu.com/view/1071a6db6f1aff00bed51e66.html

1、线性拟合

已知一组数据点,满足函数y=ax+b,利用最小二乘法的原理求解a和b。

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

图中数字10是有10个数据点

matlab代码

%% 线性拟合 Linear fitting
x=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1];
y=[2.3201,2.6470,2.9070,3.2885,3.6008,3.9090,4.2147,4.5191,4.8232,5.1275];
figure(1);
plot(x,y,'o');
hold on;
[a,b]=Linear_fitting(x,y);

t=0.1:0.1:1;
z=a*t+b;
plot(t,z);

function [a,b]=Linear_fitting(x,y)
n=size(x,2);
sum_xy=sum(x.*y);
sum_x=sum(x);
sum_y=sum(y);
sum_xx=sum(x.*x);

a=(n*sum_xy-sum_x*sum_y)/(n*sum_xx-sum_x^2);
b=(sum_xy-sum_xx*sum_y/sum_x)/(sum_x-n*sum_xx/sum_x);

% a=(n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x));
% b=(sum(x.*y)-sum(x.*x)*sum(y)/sum(x))/(sum(x)-n*sum(x.*x)/sum(x));
end
           

2、多项式拟合

已知一组数据点,满足多项式函数

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

利用最小二乘法的原理求解参数a0,a1,…,ak。

得到损失函数

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

为了目标函数最优,对每个参数求偏导数,并令k个偏导数为0.

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

利用矩阵乘法形式XA=Y求解A

最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法
最小二乘法原理与MATLAB代码——线性拟合、多项式拟合、指定函数拟合最小二乘法

讲解链接:最小二乘法—多项式拟合非线性函数 - 简书 (jianshu.com)

MATLAB最小二乘法 - 凯鲁嘎吉 - 博客园 (cnblogs.com)

matlab代码

x=[0.1732;0.1775;0.1819;0.1862;0.1905;0.1949;0.1992;0.2035;0.2079;0.2122;0.2165;0.2208;0.2252;0.2295;0.2338;0.2384];
y=[-3.41709;-4.90887;-6.09424;-6.95362;-7.63729;-8.12466;-8.37153;-8.55049;-8.61958;-8.65326;-8.60021;-8.52824;-8.43502;-8.32234;-8.20419;-8.04472];
m=3;
figure(2);
plot(x,y,'o');
hold on;
p=Polynomial_fitting(x,y,m);
Polynomial_fitting_plot(p,x,m);%绘制图像

function P=Polynomial_fitting(x,y,m)  %x,y为序列长度相等的数据向量,m为拟合多项式次数
a=zeros(2*m+1,1);
for i=0:2*m
    a(i+1,1)=sum(x.^i);
end
b=zeros(m+1,1);
for i=0:m
    b(i+1,1)=sum((x.^i).*y);
end
A=zeros(m+1,m+1);
for i=1:m+1
    for j=1:m+1
        A(i,j)=a(i+j-1,1);
    end
end
p=A\b;
P=fliplr(p'); %左右翻转矩阵
%https://www.cnblogs.com/kailugaji/p/6932482.html
end

function Polynomial_fitting_plot(p,t,m)
z=zeros(1,size(t,2));
for i=0:m
    z=z+p(m-i+1)*t.^i;
end
plot(t,z);
end
           

3、指定非线性函数拟合

已知一组数据点,满足函数

y = a ( 1 ) x 2 + a ( 2 ) s i n ( x ) + a ( 3 ) x 3 y=a(1)x^2+a(2)sin(x)+a(3)x^3 y=a(1)x2+a(2)sin(x)+a(3)x3

利用最小二乘法求解参数a(1),a(2),a(3)

matlab 中提供一个lsqcurvefit函数

x = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
y = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
a=[1 1 1]; %初始估计值
[p,resnorm]=lsqcurvefit(@fun,a,x,y); %指定拟合曲线    resnorm残差的平方范数,返回为非负实。
figure(3);
plot(x,y,'o');
hold on;
t=1:1:10;
z=fun(p,t);
plot(t,z);

function F=fun(a,x)
F=a(1)*x.^2+a(2)*sin(x)+a(3)*x.^3;

%https://wenku.baidu.com/view/1071a6db6f1aff00bed51e66.html
end
           

原文链接:原创,转载请标明出处!

继续阅读