0.写在前面

最小二乘法在工程中得到了广泛的应用,应用最多的是直线拟合(线性拟合),这里做一下总结。首先我们从原理来认识一下线性拟合,然后利用matlab多种方法进行线性参数拟合。

1.原理介绍

给定一系列xix_ixi​,yi(i=1,2,⋯,N)y_i(i=1,2,\cdots,N)yi​(i=1,2,⋯,N),假定它们具有线性关系,即可以用y=kx+by=kx+by=kx+b的方式进行拟合,我们的任务是找到最优参数k和b使得xix_ixi​、yiy_iyi​和直线y=kx+by=kx+by=kx+b最大程度接近,这个时候最小二乘法就派上用场了。

为了描述最小二乘法拟合参数k和b的效果,我们需要定义一个优化函数,为了避免正负相消,所以使用残差(实际观察值与估计值(拟合值)之间的差)平方和来定义:

f=Σ(yi−kxi−b)2f=\Sigma(y_i-kx_i-b)^2f=Σ(yi​−kxi​−b)2

当拟合效果最好时,残差平方和最小是显然的,问题转化为求解fff为极值点时,kkk和bbb为多少?

解决极值点问题,我们需要对kkk和bbb分别求偏导数并使其为0:

式(1)

式(2)

由式(2)括号内为0,则有b的表达式

式(3)

将式(3)代入到式(2)中得到式(4)

式(4)

整理式(4)我们可以得到k的表达式

式(5)

所以最终kkk和bbb的表达式可以表示为:

式(6)

如果用线性代数的角度来看其实矩阵表达更加简洁,我们最终需要寻找最佳的kkk和bbb:

式(7)

写成矩阵的形式:

式(8)



我们可以写成矩阵形式:

式(9)

Y=XK\mathbf{Y}=\mathbf{X}\mathbf{K}Y=XK

我们要解K,这时候X如果是方阵那么自然的就可以左右两边同时乘X的逆,但是如果X不是方阵(行数大于列数),我们可以左右同乘以X的转置,转换为方阵再取逆(当然能取逆的前提是行列式不能为0),具体如下,求得的逆叫做伪逆:

式(10)

所以解得K的值:

式(11)

2.matlab实现

现在有这么一组数据

我们利用matlab进行绘制散点图查看一下

x=[0.1;0.3;0.4;0.75;0.9];
y=[1.7805;2.2285;2.3941;3.2226;3.5697];
plot(x,y,'o')
xaxis(0,1);
yaxis(1.6,3.7);
hold on;

可以看出满足很好的线性关系,下面我们用上述最小二乘法的思想求一下拟合直线的kkk和bbb:

方法1:代数方法计算

利用公式(6)

我们来计算一下

% 方法1:代数方法计算
N=length(x);
k=(sum(y.*x)-N*mean(y)*mean(x))/(sum(x.^2)-N*mean(x)^2);
b=mean(y)-k*mean(x);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)


查看k和b的值:

k=2.2411
b=1.5409

方法2:伪逆方法计算

利用公式(11)


按照前面的原理进行编写:

% 方法2:伪逆计算
N=length(x);
X=[x,ones(N,1)];
Y=y;
K=inv(X'*X)*X'*Y;
k=K(1);
b=K(2);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)


查看k和b的值:

k=2.2411
b=1.5409

方法3:利用matlab自带的lsqcurvefit函数计算(拟合非线性函数,应用更广)

matlab自带的lsqcurvefit函数也可以进行最小二乘拟合(还可以拟合非线性函数),其调用方式为:

各输入参数含义:

  • fun:函数的表达式,使用匿名函数或另外定义一个函数的m文件
  • x0:拟合参数的初始值
  • xdata:自变量x数据
  • ydata:因变量y数据
  • lb:参数的下限
  • ub:参数的上限
  • options:设置步长、精度等

我们使用函数的第一种方法进行参数的拟合:

% 方法3:利用matlab自带的lsqcurvefit函数计算
fun=@(K,x)K(1)*x+K(2);
K0=[1,1];
K=lsqcurvefit(fun, K0, x,y)
k=K(1);
b=K(2);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)

查看k和b的值:

k=2.2411
b=1.5409

方法4:利用matlab自带的polyfit函数计算(多项式函数拟合)

polyfit函数可以用来最小二乘匹配函数。Matlab 包括一个标准函数,对多项式进行最小二乘匹配运算。函数 polyfit 用一系列数据对 N 阶多项式进行最小二乘匹配运算。其中N是任意大于等于1。

当 N=1 时,得到的是直线方程,得到拟合直线方程的斜率k和b,调用该函数的形式如下:

p = polyfit(x,y,n)

其中xx,y 代表向量 x,y,n 代表阶次,这里我们就选择n=1,然后我们可以编写下面的代码:

K=polyfit(x,y,1);
k=K(1);
b=K(2);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)

查看k和b的值:

k=2.2411
b=1.5409

结果是一样的。

总结

介绍了最小二乘法拟合直线的两种观点:代数计算和伪逆方法计算,并且利用上述两种方法以及matlab自带的lsqcurvefit和polyfit两种函数使用matlab进行了拟合,可以看到结果是一样的。

最小二乘法线性拟合介绍以及matlab实现相关推荐

  1. 最小二乘法线性拟合及其代码实现(C语言)

    文章目录 前言 一.最小二乘法 二.代码实现(C语言) 三.缺陷与不足 1. 对异常值很敏感 2. 没有考虑自变量的误差 3. 存在不可求解的情况 总结 参考 前言 最小二乘法是最常用的数据拟合方法. ...

  2. 最小二乘法函数拟合原理及matlab实现—数学笔记

    最小二乘法函数拟合原理及matlab实现 --数值分析数学笔记 如有纰漏,欢迎指正 文章目录 最小二乘法函数拟合原理及matlab实现 前言 一.拟合标准 1.使偏差向量满足 1 1 1 - 范数 2 ...

  3. Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化

    因为作为资源上传不方便我们获取且我想免费分享给有需要的小伙伴,以后所有实验报告都通过文章形式记录输出了,仅供参考,欢迎交流.(最小二乘法代码在文末) 电桥特性曲线: Java实现最小二乘法线性拟合及计 ...

  4. 数学建模——多元线性回归 /多元线性拟合 (工具:matlab)

    文章目录 一.多元线性回归是什么 二.样例及代码 第一步:画散点图进行分析 第二步:拟合 三.总结: 四.参考附录: 技巧篇

  5. matlab 限定参数范围,MATLAB如何在限定参数范围时进行线性拟合

    本人小白,想请教如何在限定参数范围的情况下进行线性拟合. 在MATLAB中,通常解一个多元超定方程组,如 A=[1,2,3; 2,3,4; 3,4,5; 4,5,6; 5,6,7]; b=[40,50 ...

  6. 最小二乘法线性拟合和2次曲线拟合算法

    最近由于项目要求,应用了最小二乘法线性拟合和2次曲线拟合算法,现总结如下: 最小二乘法线性拟合应用已有的采样时间点,再现这些点所描述的线性变化,即求出一个线性方程y=ax+b(这个算法的主要问题也就是 ...

  7. Matlab 隐函数方程求解最小二乘法拟合一阶线性拟合二阶拟合传感器实验

       九层妖塔 起于垒土 Matlab 最小二乘法拟合一阶线性拟合&传感器实验 一.代码 二.数据处理结果 三.Notes 一.代码 %电容传感器位移实验数据 最小二乘法一阶线性拟合 x = ...

  8. matlab最小二乘法拟合图旋转,【Matlab】—{最小二乘法拟合一阶线性拟合传感器实验}...

    [Matlab]-{最小二乘法拟合一阶线性拟合传感器实验} [Matlab]-{最小二乘法拟合一阶线性拟合&传感器实验} ???九层妖塔?起于垒土 [Matlab]-{最小二乘法拟合一阶线性拟 ...

  9. matlab 线性最小二乘法,matlab_最小二乘法线性和非线性拟合.ppt

    3.血液容积v, t=0注射剂量d, 血药浓度立即为d/v. 2.药物排除速率与血药浓度成正比,比例系数 k(>0) 模型假设 1. 机体看作一个房室,室内血药浓度均匀--一室模型 模型建立 在 ...

  10. 基于matlab数据线性拟合回归

    1 选题背景及意义 在统计学中,线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.只有一个自变 ...

最新文章

  1. python turtle循环图案-Python绘图Turtle库详解
  2. 什么叫做类数组对象?
  3. LeetCode 430. Flatten a Multilevel Doubly Linked List
  4. Python新手常见错误汇总|附代码检查清单
  5. dbcp_c3p0连接mysql8.0.13
  6. 创业要有创意--应当注意的八大细节
  7. avalon视频学习笔记(六)
  8. linux adc是什么设备,Linux 驱动--ADC驱动
  9. unity每次运行总是game窗口最大化怎么解决?
  10. NDK编译时指定NDK_MODULE_PATH的方法
  11. js 文件下载请求两种方式
  12. 修改postgresql库表的owner
  13. UDP Flood防范
  14. UniPro助力半导体企业之低代码平台篇:高效协同快速响应
  15. select获取选中的option(包含value和text,重点是text怎么获取)
  16. sublime软件中如何给很多行数据加逗号及双引号并转换成一行?
  17. ubuntu 制作本地源 离线安装
  18. 什么是云计算的?云计算的定义、特征、模型分别是什么?
  19. 好看的网站正在升级维护中html单页源码
  20. 外星人跑深度学习_P106真香?低成本深度学习平台搭建

热门文章

  1. 2021年中国上牌和驾驶员数量分析:新注册登记机动车3674万辆 新领证驾驶人2750万人[图]
  2. Can‘t connect to any repository: http://gitee.com/user.rame/java.git
  3. sql 连接mysql数据库服务器失败_数据库连接失败的原因及解决方法
  4. word复制或粘贴等操作使应用未响应
  5. 荣耀继承者android,荣耀继承者后期阵容推荐,一套万金油阵容介绍给大家
  6. ESP8266驱动RDA5807实现的FM收音机,可连接WiFi显示B站粉丝数
  7. 关于导出聊天记录这件事……
  8. 苹果电脑桌面文件不见了怎么恢复
  9. JAVA基础知识之BufferedWriter流
  10. uni-app前端解密微信小程序手机号加密数据