草庐IT

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

小林up 2023-04-18 原文

0.写在前面

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

1.原理介绍

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

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

f = Σ ( y i − k x i − b ) 2 f=\Sigma(y_i-kx_i-b)^2 f=Σ(yikxib)2

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

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

式(1)

式(2)

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

式(3)

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

式(4)

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

式(5)

所以最终 k k k b b b的表达式可以表示为:

式(6)

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

式(7)

写成矩阵的形式:

式(8)



我们可以写成矩阵形式:

式(9)

Y = X K \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;

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

方法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. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐