最小二乘法的几种拟合函数

这篇具有很好参考价值的文章主要介绍了最小二乘法的几种拟合函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.最小二乘法的原理和解决的问题

2.最小二乘法的公式解法

2.1  拟合h(x) = a * x

2.2 拟合 h(x) = a0 + a1*x

2.3拟合 h(x) = a0 + a1 *x + a3 * x^3


 因为采用矩阵法来进行最小二乘法的函数拟合时,会出现系数矩阵的逆矩阵不存在的情况有一定的局限性,所以本篇对公式法进行简单说明。并用c++进行代码的书写。

1.最小二乘法的原理和解决的问题

最下二乘法的形式:

目标函数 =   (观测值  -  理论值)^2

        观测值就是我们实际数据中的值,理论值就是我们进行函数拟合后用拟合函数计算出的值。

本篇中我们以最简单的线性回归为例进行说明。

        我们有n组样本(Xi,Yi) i = (1,2,3,……,n)

        拟合函数的形式:h(x) = a0 + a1 * x + a2 *x^2 + a3 *x^3.

        最小二乘法要做的就是找到最小的一组 a(a0 、a1、a2、a3……),使得

         (h(x) -  yi)^2最小。方法就是对各个系数求偏导,并让偏导数等于0即可。

2.最小二乘法的公式解法

2.1  拟合h(x) = a * x

      对a求偏导得:

 2 *  = 0

 化简得:a = Lxy / Lxx

 其中  Lxx =   ,   Lxy = ,ex为x的均值,ey为y的均值

代码如下:

double calculate(std::vector<double> xs,std::vector<double> ys){

    int len = xs.size();

    double Lxy = 0;
    double Lxx = 0;

    for(int i = 0; i < len ; i++){
        Lxy += xs[i] * ys[i];
        Lxx += qPow(xs[i],2);
    }

    double ret = 0;
    ret = Lxy / Lxx;
    return ret;
}

2.2 拟合 h(x) = a0 + a1*x

对a0和a1分别求偏导的得:

a0: = 0

a1:   2 * = 0

 联立两个方程解得:a0 = ey - a1 * ex 

                                 a1 = Lxy / Lxx(ex、ey、Lxy 和Lxx的含义同上)

代码如下:

double *calculate1(std::vector<double> xs,std::vector<double> ys){
    int len = xs.size();

    //结果
    double *ret = new double[2];

    double ex = 0;//x坐标的均值
    double ey = 0;//y坐标的均值
    double Lxx = 0;//x坐标的平方差*len
    double Lxy = 0;//(Xi-ex)*(Yi-ey)

    //辅助计算
    double xsum = 0;//x的和
    double ysum = 0;//y的和

    //计算xusm
    for(int i = 0; i < len ; i++){
        xsum += xs[i];
        ysum += ys[i];
    }
    ex = xsum / len;
    ey = double(ysum / len);
    for(int i = 0; i < len ; i++){
        Lxx += pow(xs[i]-ex,2);
        Lxy += (xs[i]-ex)*(ys[i]-ey);
    }


    ret[1] = Lxy / Lxx;//计算a1
    ret[0] = ey - ret[1]*ex;//计算a0
    return ret;
}

2.3拟合 h(x) = a0 + a1 *x + a3 * x^3

对a0、a1和a3分别求偏导的得:

a0:    2* = 0;

a1:   2* = 0;

a3 :   2* = 0

联立方程组解得:

a0 = ey - a1*ex - a3 * ex^3( ey为y 的均值,ex 为x的均值,ex^3为x^3的均值)

a1 = (Lxy * L(x^3)(x^3) - Lx^3 y * Lxy) / (Lxx *L(x^3)(x^3) - Lxy*Lyx)

a3 = (Lx^3y * Lxx - Lxy * L(x^3)*x) / (Lxx*L(x^3*x^3) - Lxy*Lyx)

Lxy、Lxx含义同上

L(x^3)(x^3)表示:

Lx3y表示:

 代码如下:

double *calculate(std::vector<double> xs,std::vector<double> ys){

    int len = xs.size();

    double ey = 0;//y的均值
    double ex1 = 0;//x的均值
    double ex3 = 0;//x的三次方的均值
    double L11 = 0;//x的平方差
    double L12 = 0;//x的3次方的平方差*len
    double L21= 0;//等于L12
    double L1y = 0;//(Xi-ex)*(Yi-ey)的和
    double L2y = 0;//(Xi^3-ex3)*(Yi-ey)的和
    double L22 = 0;//x的3次方的平方差*len
    double Lyy = 0;//y的平方差*len

    double ysum = 0;
    double xsum1 = 0;
    double xsum3 = 0;

    //计算均值
    for(int i = 0; i < len; i++){

        ysum += ys[i];//y的总和

        xsum1 += xs[i];//x的总和
        xsum3 += std::pow(xs[i],3);//x的3次方的总和
    }
    //计算各个值
    ey = ysum / len;
    ex1 = xsum1 / len;
    ex3 = xsum3 / len;

    for(int i = 0 ; i < len ;i++){
        L11 += qPow(xs[i]-ex1,2);//x的方差*len

        L12 += (xs[i]-ex1)*(qPow(xs[i],3)-ex3);

        L1y += (xs[i]-ex1)*(ys[i]-ey);
        L2y += (qPow(xs[i],3)-ex3)*(ys[i]-ey);

        L22 += qPow((qPow(xs[i],3)-ex3),2);//x的3次方的方差*len

        Lyy += qPow(ys[i]-ey,2);
    }
    L21 = L12;
    double ret[3];
    ret[2] = (L2y * L11 - L1y * L21)/(L11 * L22 - L12 * L21);
    ret[1] = (L1y * L22 - L2y * L12)/(L11 * L22 - L12 * L21);
    ret[0] = ey - ret[1]*ex1 - ret[2]*ex3;
   
    return ret;
}

以上是我在编写一个插值函数时遇到矩阵法不可以求出拟合函数后,从原始的概念入手进行的函数拟合,如有差错之处欢迎批评指正。文章来源地址https://www.toymoban.com/news/detail-534605.html

到了这里,关于最小二乘法的几种拟合函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

    我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵

    2024年02月08日
    浏览(58)
  • 数值分析——曲线拟合的最小二乘法

    拟合曲线定义:求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 (时间紧迫直接看例子就行,智慧交通专业的补修课,可能理论学的不那么深入,主要是方法。) 超定方程组 是指方程个数大于未知量个数的方程组 。 最小二乘解 : 对于

    2024年02月09日
    浏览(44)
  • Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)

    最小二乘法 拟合平面是我们最常用的拟合平面的方法,但是有特殊的情况是用这种方法是不能拟合的,后续会加上这种拟合方法(RANSAC)。 matlab 最小二乘拟合平面(方法一) - 灰信网(软件开发博客聚合) 平面方程:Ax+By+Cz+D=0;   1、随机出来一些离散的点    2、将其写成

    2024年02月16日
    浏览(48)
  • 【Matlab】最小二乘法拟合多项式

    在最近的电机项目中,有遇到有传感器数据并不线性的问题,然后想要用最小二乘法做个曲线拟合,反过来去校准不线性的传感器的数据,因此记录一下使用最小二乘法来拟合多项式的曲线的步骤。本篇从最小二乘法的原始公式入手编写M文件,目的是方便使用单片机实现,或

    2023年04月22日
    浏览(44)
  • 最小二乘法公式

    最小二乘法我不需要理解他的本质,只需要会使用这个公式即可: 最小二乘法是求解拟合直线的。注意!!是直线 设直线的方程为 y=bx+a 则以上公式就是用一堆二维平面上的点,来求拟合的直线 其中   为求和符号     如 的意思是   求xi的平方的和    为期望,即平均值

    2024年02月11日
    浏览(74)
  • C语言编程:最小二乘法拟合直线

    本文研究通过C语言实现最小二乘法拟合直线。 最小二乘法,简单来说就是根据一组观测得到的数值,寻找一个函数,使得函数与观测点的误差的平方和达到最小。在工程实践中,这个函数通常是比较简单的,例如一次函数或二次函数。 汽车上的毫米波雷达可以探测到其他目

    2024年02月12日
    浏览(39)
  • 数值计算大作业:最小二乘法拟合(Matlab实现)

        作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业。      我把最小二乘算法在MATLAB中整合成了一个M函数文件least square fitting.m,直线拟合函数lsf_linear.m,以及抛物线拟合函数lsf_parabolic.m。程序放在文章最后了,需要的同学自取。下文为作业详

    2024年02月07日
    浏览(41)
  • chatgpt赋能python:Python如何拟合直线:使用最小二乘法

    在数据分析和机器学习领域,拟合一个最佳的直线是很常见和有用的。Python中有很多库可以拟合直线,但最小二乘法是其中最常用的一种方法。在本文中,我们将介绍最小二乘法的原理和如何在Python中实现。 最小二乘法是一种常用的回归分析方法,目的是找到一条直线来拟合

    2024年02月08日
    浏览(60)
  • 最小二乘法,极大似然估计,交叉熵的公式推导

    最小二乘法、极大似然估计和交叉熵是常用的三种损失函数。 最小二乘法是一种回归问题中常用的损失函数,用于衡量预测值与实际值之间的误差平方和。它常用于线性回归问题中,目标是最小化预测值与真实值之间的均方误差(MSE)。 极大似然估计(Maximum Likelihood Estima

    2024年02月08日
    浏览(42)
  • 3D点云处理:用SVD分解法和最小二乘法拟合平面点云,求解平面方程

    本文主要介如何用SVD分解法和最小二乘法拟合平面点云,包含原理推导和代码 将空间中的离散点拟合为一个平面,就是使离散点到某个平面距离和最小的问题,可以将求解过程看作最优化的过程。 一个先验知识为拟合平面一定经过离散点的质心(离散点坐标的平均值)。平

    2024年02月03日
    浏览(177)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包