最小二乘法曲线拟合以及Matlab实现

最小二乘法曲线拟合以及Matlab实现最小二乘法曲线拟合以及Matlab实现在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。目录最小二乘法直线拟合原理曲线拟合Matlab实现代码最小二乘法直线线拟合原理首先,我们从曲线拟合的最简单情况——直线拟合来引……

大家好,又见面了,我是你们的朋友全栈君。

最小二乘法曲线拟合以及Matlab实现

在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。

目录

  • 最小二乘法直线拟合原理
  • 曲线拟合
  • Matlab实现代码

最小二乘法直线线拟合原理

首先,我们从曲线拟合的最简单情况——直线拟合来引入问题。如果待拟合点集近似排列在一条直线上时,我们可以设直线 y = a x + b y=ax+b y=ax+b 为其拟合方程,系数 A = [ a , b ] A=[a,b] A=[a,b] 为待求解项,已知:
这里写图片描述

用矩阵形式表达为: Y = X 0 A Y=X_{0}A Y=X0A,其中:
这里写图片描述
要求解A,可在方程两边同时左乘 X 0 X_{0} X0 的逆矩阵,如果它是一个方阵且非奇异的话。

但是,一般情况下 X 0 X_{0} X0 连方阵都不是,所以我们在此需要用 X 0 X_{0} X0 构造一个方阵,即方程两边同时左乘 X 0 X_{0} X0 的转置矩阵,得到方程: X 0 T Y = X 0 T X 0 A X_{0}^{T}Y=X_{0}^{T}X_{0}A X0TY=X0TX0A

此时,方程的系数矩阵 X 0 T X 0 X_{0}^{T}X_{0} X0TX0 为方阵,所以两边同时左乘新系数矩阵 X 0 T X 0 X_{0}^{T}X_{0} X0TX0 的逆矩阵,便可求得系数向量A ,即: ( X 0 T X 0 ) − 1 X 0 T Y = A (X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A (X0TX0)1X0TY=A

方程 A = ( X 0 T X 0 ) − 1 X 0 T Y A=(X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y A=(X0TX0)1X0TY 右边各部分均已知,所以可直接求解得到拟合直线的方程系数向量A。

曲线线拟合

当样本点的分布不为直线时,我们可用多项式曲线拟合,即拟合曲线方程为n阶多项式

y = ∑ i = 0 n a i x i = a n x n + a n − 1 x n − 1 + . . . + a 1 x + a 0 y=\sum_{i=0}^{n}a_ix^i=a_nx^n+a_{n-1}x^{n-1}+…+a_1x+a_0 y=i=0naixi=anxn+an1xn1+...+a1x+a0

用矩阵形式表示为: Y = X 0 A Y=X_0A Y=X0A ,其中:

X0

待求解项为系数向量 A = [ a n , a n − 1 , . . . , a 2 , a 1 , a 0 ] T A=[a_n,a_{n-1},…,a_2,a_1,a_0]^T A=[an,an1,...,a2,a1,a0]T

曲线拟合方程 Y = X 0 A Y=X_0A Y=X0A 的求解方法与上面直线的求解方法一样,也是在方程 Y = X 0 A Y=X_0A Y=X0A 两边同左乘 X 0 X_0 X0的转置矩阵得到: X 0 T Y = X 0 T X 0 A X_{0}^{T}Y=X_{0}^{T}X_{0}A X0TY=X0TX0A

再同时在新方程两边同时左乘 X 0 T X 0 X_{0}^{T}X_{0} X0TX0 的逆矩阵,得到: ( X 0 T X 0 ) − 1 X 0 T Y = A (X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A (X0TX0)1X0TY=A

上式左边各部分均已知,所以可直接求解得拟合曲线方程的系数向量A。

Matlab实现代码

%by hanlestudy@163.com
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~,k]=size(x);
for n=1:9
    X0=zeros(n+1,k);
    for k0=1:k           %构造矩阵X0
        for n0=1:n+1
            X0(n0,k0)=x(k0)^(n+1-n0);
        end
    end
    X=X0';
    ANSS=(X'*X)\X'*y';
    for i=1:n+1          %answer矩阵存储每次求得的方程系数,按列存储
       answer(i,n)=ANSS(i);
   end
    x0=0:0.01:17;
    y0=ANSS(1)*x0.^n    ;%根据求得的系数初始化并构造多项式方程
    for num=2:1:n+1     
        y0=y0+ANSS(num)*x0.^(n+1-num);
    end
    subplot(3,3,n)
    plot(x,y,'*')
    hold on
    plot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')

运行结果

拟合曲线结果:

可以看出看来,当多项式的阶数过小是,曲线并不能很好地反映出样本点的分布情况;但阶数过高时,会出现过拟合的情况。
这里写图片描述

系数矩阵answer:

这里写图片描述

Matlab自带函数——polyfit

在matlab中,也有现成的曲线拟合函数polyfit,其也是基于最小二乘原理实现的,具体用法为:ans=polyfit(x,y,n). 其中x,y为待拟合点的坐标向量,n为多项式的阶数。

下面代码是用polyfit函数来做曲线拟合:

clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
[~,k]=size(x);
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
for n=1:9
    ANSS=polyfit(x,y,n);  %用polyfit拟合曲线
    for i=1:n+1           %answer矩阵存储每次求得的方程系数,按列存储
       answer(i,n)=ANSS(i);
   end
    x0=0:0.01:17;
    y0=ANSS(1)*x0.^n    ; %根据求得的系数初始化并构造多项式方程
    for num=2:1:n+1     
        y0=y0+ANSS(num)*x0.^(n+1-num);
    end
    subplot(3,3,n)
    plot(x,y,'*')
    hold on
    plot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')

运行结果:

用polyfit拟合的结果与第一份代码运行的结果基本一样
这里写图片描述

申明

本文为本人原创,转载请注明出处!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152976.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 完全卸载oracle11g步骤

    完全卸载oracle11g步骤完全卸载oracle11g步骤:1、开始->设置->控制面板->管理工具->服务停止所有Oracle服务。2、开始->程序->Oracle-OraHome81->OracleInstallationProducts->UniversalInstaller,单击“卸载产品”-“全部展开”,选中除“OraDb11g_home1”外的全部目录,删除。5、运行regedit

  • 互联网广告综述之点击率特征工程

    互联网广告综述之点击率特征工程

  • ASSERT 和 ASSERT_VALID[通俗易懂]

    ASSERT 和 ASSERT_VALID[通俗易懂]这个宏都是MFC的调试宏.ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题。事实上,ASSERT_VALID宏就是转化为对象的成员函数AssertValid()的调用,只是这种方法更安全。它的参数是一个对象指针,通过这个指针来调用它的AssertValid()成员…

  • java接口详解

    java接口详解Java基础——接口一、接口的概述:官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。我的解释:接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解)二、接

  • 微管滑动模型动画_滑动平均序列

    微管滑动模型动画_滑动平均序列因为本人是自学深度学习的,有什么说的不对的地方望大神指出指数加权平均算法的原理TensorFlow中的滑动平均模型使用的是滑动平均(MovingAverage)算法,又称为指数加权移动平均算法(exponenentiallyweightedaverage),这也是ExponentialMovingAverage()函数的名称由来。先来看一个简单的例子,这个例子来自吴恩达老师的De…

    2022年10月24日
  • intellij idea 激活码[最新免费获取]「建议收藏」

    (intellij idea 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlS32PGH0SQB-eyJsaWN…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号