目录

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坐标的平方差*lendouble Lxy = 0;//(Xi-ex)*(Yi-ey)//辅助计算double xsum = 0;//x的和double ysum = 0;//y的和//计算xusmfor(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;//计算a1ret[0] = ey - ret[1]*ex;//计算a0return 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次方的平方差*lendouble L21= 0;//等于L12double L1y = 0;//(Xi-ex)*(Yi-ey)的和double L2y = 0;//(Xi^3-ex3)*(Yi-ey)的和double L22 = 0;//x的3次方的平方差*lendouble Lyy = 0;//y的平方差*lendouble 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的方差*lenL12 += (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次方的方差*lenLyy += 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;
}

以上是我在编写一个插值函数时遇到矩阵法不可以求出拟合函数后,从原始的概念入手进行的函数拟合,如有差错之处欢迎批评指正。

最小二乘法的几种拟合函数相关推荐

  1. python拟合函数_Python-最小二乘法曲线拟合

    行文思路:最小二乘法原理介绍 利用 leastsq() 函数进行最小二乘法拟合 拟合注意事项 利用curve_fit 进行最小二乘法拟合 总结: 参考文献 实现代码 一,最小二乘法拟合 最小二乘法是一 ...

  2. 基于粒子群算法与最小二乘拟合函数参数

    前言 今天更新较晚主要还是学业繁忙,学习素材也不是很好找,可能很多同学们都在做数学建模以及应用统计时都会涉及到函数参数拟合的问题,一般最常用的方法是最小二乘法,但是当函数参数很多时,往往去普通最小二乘 ...

  3. Halcon算子学习:XLD几种边缘连接函数

    Halcon算子学习:XLD几种边缘连接函数 1.union_cotangential_contours_xld (Contours : UnionContours : FitClippingLeng ...

  4. MATLAB拟合函数使用说明

    (由于不方便上传公式,有部分直接截图) 2. Polyval函数 对应多项式拟合,多项式求值函数也相当重要,可以通过设定向量,快速定义如下多项式 据此,可以大概猜测到polyval调用的形式了 y = ...

  5. OpenCV fitline直线拟合函数学习

    下图是OpenCV官方文档中,对直线拟合函数的详细介绍: fitLine()函数用于,对二维或三维空间中的点集进行直线拟合.共有六个参数: param 1:输入的点集,可以是Mat或者vector&l ...

  6. matlab中多项式拟合如何给出r方,matlap拟合函数后r^2怎么求

    matlab拟合函数 求助 尝试用二次多项式拟合: clearall; x=2:2:20; y=[0.31.232.416.267.958.529.049.179.299.37]; scatter(x ...

  7. matlab使用自带的拟合工具cftool对数据进行拟合并生成拟合函数代码

    在数据处理中经常会需要对数据进行拟合,拟合完成之后可以通过拟合曲线的方程对数据进行预测.下面主要介绍一下如何适用matlab自带的拟合工具包对数据进行拟合,全程不需要编写一句代码,拟合完成之后还能生成 ...

  8. 神经网络拟合函数表达式,神经网络拟合效果不好

    神经网络,什么过拟合?,什么是欠拟合? 欠拟合是指模型不能在训练集上获得足够低的误差.而过拟合是指训练误差和测试误差之间的差距太大.考虑过多,超出自变量的一般含义维度,过多考虑噪声,会造成过拟合. 可 ...

  9. matlab工具箱拟合函数

    Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类型的线性.非线性曲线拟合,下面简单介绍如何使用这个工具箱. 先给定两个变量: x = [1,2,3,4,5,6,7,. ...

最新文章

  1. xshell如何登陆堡垒机_Xshell连接有跳板机(堡垒机)的服务器
  2. 实验室管理好助手——Bio-lab
  3. 许可证无效_未取得预售许可证所签买房合同是否一概无效?
  4. 软件架构视图—4+1模式
  5. Colaboratory下载Kaggle数据
  6. mysql录入foreigen错误_编译安装MySQL5.6失败的相关问题解决方案
  7. [JavaWeb]Web概念概述
  8. 漫画:什么是ConcurrentHashMap
  9. 分布式事务的特征、原理、以及常见3种解决方案
  10. PGA自动管理原理深入分析及性能调整
  11. OpenSSL之PKey的EVP封装
  12. MATLAB信号处理---学习小案例(2)---采样定理
  13. Javascript特效代码大全(420个)
  14. 《5分钟商学院》--读书笔记
  15. ssh遇到密钥更改问题
  16. Git版本库深入剖析
  17. Fly-小学妹都喜欢的Go后端项目
  18. Element-Ui记录(三)——字体色彩按钮边框
  19. 再读《谁动了我的奶酪》
  20. HBase与Hadoop生态其他组件的联系

热门文章

  1. 企业微信机器人读取服务器,智能机器人如何对接到企业微信?
  2. 线性代数几何直观的理解
  3. GF(2^8)下查表实现多项式乘法
  4. Excel多人同时编辑的几种方案与比较
  5. access下如何配置两个vlan_锐捷三层交换机创建的两个vlan之间怎么样配置能通
  6. ADSafe超级精简汇编修改无提示爽歪歪版
  7. 一套极简的MQTT使用接口EasyMqttClient
  8. Java实现简单的贪吃蛇
  9. python爬取知乎live_【实战视频教程】使用scrapy爬知乎live信息
  10. 238. 银河英雄传说