MATLAB与最小二乘法拟合数据

1、前言:学习并记录的原因

最小二乘法是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。

最小平方差法在误差估计、不确定度、系统辨识及预测、预报等数据处理诸多学科领域得到广泛应用的数学工具——【From百度百科】。

2、MATLAB基于最小二乘法原理的函数拟合

(1)常见的数据拟合有直线拟合、多项式拟合、插值拟合等。首先利用MATLAB中的函数来直观体验下一次拟合。

参考:http://www.qinms.com/work/nihe.html(拟合方法)

           https://zhuanlan.zhihu.com/p/99924603?utm_source=qq

%拟合下面的数据
clear
clc
x=[9,13,15,17,18.6,20,23,29,31.7,35];
y=[-8,-6.45,-5.1,-4,-3,-1.95,-1.5,-0.4,0.2,-0.75];
%% **********************************************************%%
%{
会用polyfit函数和polyval函数
p=polyfit(x,y,n):最小二乘法计算拟合多项式系数。
x,y为拟合数据向量,要求维度相同,n为拟合多项式次数。
返回p向量保存多项式系数,由最高次向最低次排列。
y=polyval(p,x):计算多项式的函数值。
返回在x处多项式的值,p为多项式系数,元素按多项式降幂排序。
%}
%% 一次函数拟合
coefficient1=polyfit(x,y,1);  %用一次函数拟合曲线
y1=polyval(coefficient1,x);
%% 三次多项式函数拟合
coefficient2=polyfit(x,y,3);  %用三次函数拟合曲线
y2=polyval(coefficient2,x);
%% 三次多项式函数拟合
coefficient3=polyfit(x,y,15);  %用15次函数拟合曲线
y3=polyval(coefficient3,x);
%% 结果显示
figure('name','LSQ拟合','numbertitle','off')
subplot(2,2,1)
plot(x,y,'o')
grid on
title('原始离散数据')
h=legend('data');      %线型标识名
set(h,'Orientation','horizontal','Color', 'w','Box', 'on',...
    'Location','southeast','fontsize',10,'fontweight','n','fontname',...
    'times new romans','linewidth',0.5)

subplot(2,2,2)
plot(x,y,'o',x,y1,'-')
grid on
title('一次线性拟合')
h1=legend('data','poly fit');      %线型标识名
set(h1,'Orientation','vertical','Color', 'w','Box', 'on',...
    'Location','southeast','fontsize',10,'fontweight','n','fontname',...
    'times new romans','linewidth',0.5)

subplot(2,2,3)
plot(x,y,'o',x,y2,'-')
grid on
title('三次多项式拟合')
h2=legend('data','poly fit'); 
set(h2,'Orientation','vertical','Color', 'w','Box', 'on',...
    'Location','southeast','fontsize',10,'fontweight','n','fontname',...
    'times new romans','linewidth',0.5)

subplot(2,2,4)
plot(x,y,'o',x,y3,'-')
grid on
title('十五次多项式拟合')
h3=legend('data','poly fit'); 
set(h3,'Orientation','vertical','Color', 'w','Box', 'on',...
    'Location','southeast','fontsize',10,'fontweight','n','fontname',...
    'times new romans','linewidth',0.5)
%% 插值拟合***************************************************************%%
figure('name','插值拟合','numbertitle','off')
x2 = 6:0.01:35;
%{
    MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,'method')           
    其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量, 
    'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 
    'nearest'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值;
    'pchip'立方插值.缺省时表示线性插值
    注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
%}
subplot(2,2,1);
plot(x,y,'ko');
title('原始离散数据') 
grid on

y4 = interp1(x,y,x2,'spline');
subplot(2,2,2);
plot(x,y,'ko',x2,y4,'r')
title('spline插值法拟合')  
grid on

y5 = interp1(x,y,x2,'linear');
subplot(2,2,3);
plot(x,y,'ko',x2,y5,'r')
title('linear插值法拟合')  
grid on

y6 = interp1(x,y,x2,'pchip');
subplot(2,2,4);
plot(x,y,'ko',x2,y6,'r')
title('pchip插值法拟合')  
grid on

                       

3、对非线性函数进行拟合(辨识参数?)

参考:https://www.cnblogs.com/cv-pr/p/4741262.html

假设我们大概知道某数学模型的函数为:y=a*log(x)+b;在大致模型参数进行数据采样【如代码中的假设使用的参数a和b分别为-1.5、-10】,如何确定较准确的参数a和b。

%matlab的最小二乘拟合函数对非线性函数进行拟合
% [q r] = lsqcurvefit(fun, q_0, xdata, ydata);
% 输入参数:
% fun:需要拟合的函数,假定有n个需要拟合的参数,那么 q = [q1,q2,...,qn]
% q_0:表示用户给定的一个起始点
% xdata:函数的自变量
% ydata:函数的因变量
% 输出参数:
% q:表示求解得到的最优参数
% r:表示最小二乘的目标函数值,即残差。
x = 1:1:100;
a = -1.5;
b = -10;
y = a*log(x)+b;
yrand = y + 0.5*rand(1,size(y,2));% 在模拟模型参数的偏差下的采样数据
plot(x,yrand,'ro');
%% 最小二乘拟合
xf=log(x);
yf=yrand;
f=inline('b(1)+b(2).*x','b','x');% 内联函数: f(b,x) = b(1)+b(2).*x
[q,r]=lsqcurvefit(f,[1,0],xf,yf);%起点[1,0]拟合
plot(x,yrand,'ro','LineWidth',1) %绘制采样点
hold on;
%% 绘制拟合曲线
yn = q(1)+q(2)*log(x);
hold on;
grid on
plot(x,y,'c','LineWidth',2);%原函数
plot(x,yn,'b','LineWidth',2);%拟合线
%% 设置Legend
hleg = legend(['按原函数(y=' num2str(b,3) '+' num2str(a,3) 'ln(x)' ')采样数据'],...
              ['原函数为(y=' num2str(b,3) '+' num2str(a,3) 'ln(x)' ')的曲线'],...
              ['拟合结果:y=' num2str(q(1),3) '+' num2str(q(2),3) 'ln(x)'],...
              'Location','NorthEast');%本身不能设置字体的大小,需要通过set进行设置
set(hleg,'FontSize', 10, 'FontAngle','italic','FontWeight','bold',...
     'TextColor',[.6,.2,.1],'Color',[1,1,1]);%Color为设置坐标的背景颜色
 title('最小二乘拟合:y=a+b*ln(x)','Color','k','FontSize',12);
 xlabel('x','Color','k','FontSize',10);%横轴标题
 ylabel('y','Color','k','FontSize',10);%纵轴标题
 
%% 保存图像
set(1, 'InvertHardCopy', 'off');%设置的背景色有效,如果为on则图形不保存背景色,maltab 默认为 on
filename = 'lnx';
print(1, '-djpeg', filename);%其他格式 -djpeg,-dpng,-dbmp,-dtiff,-dgif

4、尝试编写的直线拟合:

https://zhidao.baidu.com/question/623179322094537004.html (很好的方便理解的一个回答,如下过程)

%% 拟合的数据
clear
clc
x=[9,13,15,17,18.6,20,23,29,31.7,35];
y=[-8,-6.45,-5.1,-4,-3,-1.95,-1.5,-0.4,0.2,-0.75];
%%  参考自编的一次直线拟合
n=length(x);        % 变量个数
x2=sum(x.^2);       % 求Σ(xi^2)
x1=sum(x);          % 求Σ(xi)
S_xy=sum(x.*y);     % 求Σ(xi*yi)
y1=sum(y);          % 求Σ(yi)
a=(n*S_xy-x1*y1)/(n*x2-x1*x1);      %解出直线斜率
b=(y1-a*x1)/n;                      %解出直线截距b=(y1-a*x1)/n
%作图
% 先把原始数据点用蓝色十字描出来
figure('name','直线拟合','numbertitle','off')
% 用红色绘制拟合出的直线
px=linspace(0 ,35,12);%0到35等线性间距的分为12份
py=a*px+b;
plot(x,y,'o',px,py,'r');
grid on 
h1=legend('data','poly fit');      %线型标识名
set(h1,'Orientation','vertical','Color', 'w','Box', 'on',...
    'Location','southeast','fontsize',10,'fontweight','n','fontname',...
    'times new romans','linewidth',0.5)
a,b
%% 对比polyfit函数的直线拟合参数
coefficient1=polyfit(x,y,1)

一次直线拟合和polyfit的一次直线拟合得到的参数是相同的。 

   

5、MATLAB工具箱cftool

参考:https://blog.csdn.net/qq_36607894/article/details/99996277(有些拟合结果评价的内容)

%% 工具箱在命令行直接运行
sftool%老版本
cftool

 后记:先记录到这里,后面有的再更。

其他参考:(1)Python版本:https://www.jianshu.com/p/af0a4f71c05a

                                                 https://zhuanlan.zhihu.com/p/72241280

                 (2)最小二乘法的本质知乎回答:https://www.zhihu.com/question/37031188

                 (3)最小二乘法的曲线拟合方法在MATLAB中的实现:https://blog.csdn.net/m0_37395228/article/details/80875529?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-3.control&dist_request_id=1328767.44919.16175350586159931&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-3.control

                 (4)matlab 最小二乘拟合平面的方法:https://blog.csdn.net/qq_36686437/article/details/109552543

猜你喜欢

转载自blog.csdn.net/weixin_39090239/article/details/115432517
今日推荐