数据拟合: 直线拟合--多项式拟合

1.问题概述

在实际问题中,常常需要从一组观察数据

       (xi,yi)  i=1,2,,..,n
去预测函数 y=f(x) 的表达式,从几何角度来说,这个问题就是要由给定的一组数据点(xi,yi)去描绘曲线 y=f(x) 的近似图像。插值方法是处理这类问题的一种数值方法。不过,由于插值曲线要求严格通过所给的每一个数据点,这种限制会保留所给数据的误差。如果个别数据的误差很大,那么插值效果显然是不理想的。
现在面对的问题具有这样的特点:所给数据本事不一定可靠,个别数据的误差甚至可能很大,但给出的数据很多。曲线拟合方法所研究的课题是:从给出的一大堆看上去杂乱无章的数据中找出规律来,就是说,设法构造一条曲线,即所谓拟合曲线,反映所给数据点总的趋势,以消除所给数据的局部波动。

2.理论与方法

假设所给数据点 (xi,yi)  i=1,2,,..,n 的分布大致成一条直线。虽然不能要求所作的拟合直线
                y = a + bx
严格的通过所有数据点(xi,yi)但总希望它尽可能地从所给数据点附近通过,就是说,要求近似地成立
              
这里,数据点的数目通常远远大于待定系数的数目,即N2,因此,拟合直线的构造本质上是个解超定方程组的代数问题。
          
表示按拟合直线y=a+bx求得的近似值,一般来说,它不同于实测值yi,两者之差称作残差。显然,残差的大小是衡量拟合好  坏的重要标志。具体地说,构造拟合曲线可以采用下列三种准则之一:

•    使残差的最大绝对值为最小,即

•    使残差的绝对值之和为最小,即

•    使残差的平方和为最小,即

分析以上三种准则,前两种提法比较自然,但由于含有绝对值运算,不便于实际应用;基于第三种准则来选取拟合曲线的方法则称作曲线拟合的最小二乘法。

3.算法与设计

1)  直线拟合

对于给定的数据点(xi,yi),i=1,2,...n求作一次式 y=a+bx ,使总误差
为最小。使Q达到极值的参数a,b应满足

即成立

式中,求和表示关于下标i从1到N求和。

2)  多项式拟合
有时所给数据点用直线拟合并不合适,这时可以考虑用多项式拟合。
对于给定的数据点(xi,yi),i=1,2,...,n求作m(m<<n)次多项式

使总误差

为最小。由于Q可以视作关于aj(j = 0,1,...,m)的多元函数,故上述拟合多项式的构造问题可归结为多元函数的极值问题。

即得到关于系数aj的线性方程组通常称作正则方程组。

4.案例分析

Example:

Data set1

Memory Capacity in GBytes

Price in US dollars

2

9.99

4

10.99

8

19.99

16

29.99

1    What's therelationship between memory capacity and cost? Pleas fitting a linear and higher polynomial function model to the data.

由实验结果可以得出在多项式拟合曲线的过程中,不一定是次数越高,结果越准确,结合实际问题与残差值得衡量,可以找到对于具体问题几阶的拟合效果更好。

汇总结果函数图像为:

根据函数图像可以得出表格:

二阶:

Memory Capacity in GBytes

Price in US dollars

2

9.54

4

12.52

8

18.49

16

30.42

三阶:

Memory Capacity in GBytes

Price in US dollars

2

9.06

4

12.61

8

19.17

16

30.1

四阶:

Memory Capacity in GBytes

Price in US dollars

2

9.99

4

11

8

19.98

16

30

通过与原表格的数据进行分析:

不难看出四阶的函数表达式最接近原题。

即:y=13.0376+-2.75*x+0.666667*x^2+-0.0267857*x^3

但是由函数的图像观察到,x在[2,15]的区间内比较符合题意,超出区间后函数的走势开始慢慢趋于不符合实际情况。所以我们考虑在15以后采用二阶的函数。

5.代码

void _2()
{//一阶double mat[105][2];double b[105];ifstream ifile;ifile.open("e:\\sat.txt");for (int i = 0; i < 105; i++){mat[i][0] = 1;ifile >> mat[i][1];// cout << mat[i][0] << "  " << mat[i][1] << endl;}for (int i = 0; i < 105; i++){ifile >> b[i];//    cout << b[i] << endl;}ifile.close();
/*double t = 0, t2 = 0, bi = 0, tb = 0;for (int i = 0; i < 105; i++){bi += b[i];for (int j = 0; j < 2; j++){if (j == 1){t += mat[i][j];t2 += mat[i][j] * mat[i][j];tb += mat[i][j] * b[i];}}}double x1 = (t2*bi - tb*t) / (105 * t2 - t*t);double x2 = (105 * tb - t*bi) / (105 * t2 - t*t);//cout << x1 << " " << x2 << endl;cout << "拟合方程(关于high_gpa):";cout << endl << "y = " << x1 << " + " << x2 << "x" << endl;//一阶
*///4阶double mat21[105][5];ifstream file;file.open("e:\\sat.txt");for (int i = 0; i < 105; i++){mat21[i][0] = 1;file >> mat21[i][1];//   cout << mat[i][0] << "  " << mat[i][1] << endl;}for (int i = 0; i < 105; i++) file >> mat21[i][2];for (int i = 0; i < 105; i++) file >> mat21[i][3];for (int i = 0; i < 105; i++) file >> mat21[i][4];for (int i = 0; i < 105; i++){file >> b[i];//   cout << b[i] << endl;}file.close();double mat22[5][105];memset(mat22, 0, sizeof(mat22));for (int i = 0; i < 5; i++){for (int j = 0; j < 105; j++){mat22[i][j] = mat21[j][i];}}double bb2[5][5];memset(bb2, 0, sizeof(bb2));for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){for (int k = 0; k < 105; k++){bb2[i][j] += mat22[i][k] * mat21[k][j];}}}double yy2[5];memset(yy2, 0, sizeof(yy2));for (int i = 0; i < 5; i++){for (int k = 0; k < 105; k++){yy2[i] += mat22[i][k] * b[k];}}double x21[5], x22[5];memset(x21, 0, sizeof(x21));memset(x22, 0, sizeof(x22));double  temp;for (int k = 0; k < 5; k++){for (int i = k + 1; i < 5; i++){temp = bb2[i][k] /bb2[k][k];for (int j = k + 1; j < 5; j++){bb2[i][j] -= temp*bb2[k][j];}yy2[i] -= temp*yy2[k];}}for (int i = 4; i >= 0; i--){x21[i] = b[i];for (int j = 4; j >= 0; j--){if (i != j){x21[i] -= bb2[i][j] * x21[j];}}x21[i] /= bb2[i][i];}cout << endl;cout << "拟合方程(关于high_gpa,math_sat,verb_sat,comp_gpa):";cout << endl << "y = " << x21[0] << " + " << x21[1] << "*high_gpa" << " + " << x21[2] << "math_sat" << " + " << x21[3] << "verb_sat" << " + " << x21[4] << "comp_gpa"<<endl;return;
}

End

数据拟合: 直线拟合--多项式拟合相关推荐

  1. 多项式拟合缺点_多项式拟合

    在网上看别人的心得 一 最小二乘法的基本原理 从整体上考虑近似函数同所给数据点(i=0,1,-,m)误差(i=0,1,-,m)的大小,常用的方法有以下三种:一是误差(i=0,1,-,m)绝对值的最 ...

  2. 多项式拟合 java_最小二乘法多项式拟合的Java实现

    背景由于项目中需要根据磁盘的历史使用情况预测未来一段时间的使用情况,决定采用最小二乘法做多项式拟合,这里简单描述下: 假设给定的数据点和其对应的函数值为 (x1, y1), (x2, y2), ... ...

  3. python多项式拟合_最小二乘法—多项式拟合非线性函数

    本章涉及到的知识点清单: 1.函数的近似表示-高次多项式 2.误差函数-最小二乘法 3.引出案例函数曲线 4.目标函数 5.优化目标函数 6.优化目标函数-梯度下降法 7.优化目标函数-求解线性方程组 ...

  4. python 拟合直线_python matplotlib拟合直线的实现

    这篇文章主要介绍了python matplotlib拟合直线的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import numpy ...

  5. matlab 高阶拟合,matlab – 将多项式拟合到函数的最大值

    我想将多项式拟合到噪声数据,使得近似多项式总是> =原始数据.例如: x = linspace (-2, 6); y = (x-2).^2 + 1 + 2 * randn (size (x)); ...

  6. excel 多项式拟合数据

    有如下一组数据和其对应的曲线波形,如何快速得到其数据函数表达式? x y 996 1250 1988 2250 3000 3550 4000 4900 要得到原始的函数表达式是比较难的,不过我们可以用 ...

  7. 数值计算之 拟合法,线性拟合,多项式拟合

    数值计算之 拟合法之线性拟合,多项式拟合 前言 最小二乘法 多项式拟合 线性拟合 后记 前言 拟合法是另一种由采样数据求取潜在函数的方法.插值要求函数必须经过每一个采样节点,而拟合则要求函数与全部节点 ...

  8. Matlab进行多项式拟合

    觉得有用的先点赞后收藏,不要只收藏不点赞!! 1⃣️一个坐标系里面绘制多个函数图像 clear clc x = [0 10 20 30 40 50 60 70 80 90 100 110 120]; ...

  9. 数学建模 拟合(最小二乘拟合,多项式拟合,自定义函数拟合)

    文章目录 matlab拟合工具箱 最小二乘拟合 理论推导 用最小二乘法求解线性回归的k,b 怎么评价拟合的精度 一个例子 另一个例子,薄膜渗透率题目,最小二乘拟合溶液浓度变化 多项式拟合 自定义函数拟 ...

  10. 【Halcon视觉】图像拟合直线

    在机器视觉领域,常见的应用场景是工业.如:手机制造,汽车制造,等等.在这些零部件生产加工时,需要对工件进行定位.通过工件的边缘,拟合直线,可实现获取工件的坐标位置. XLD分割:在获取亚像素轮廓后,需 ...

最新文章

  1. ios 支付宝支付集成
  2. HP QC IE11不支持( win7 64位 无法安装)解决方法
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
  4. java--面向对象(4)--黑马程序员
  5. QT的QTimer类的使用
  6. 向量程序C语言,一个有关向量与矩阵的实用计算器程序
  7. 克服浮躁_建立强大的全球社区时克服挑战
  8. VM安装CentOs7虚拟机后无法上网之解决方法
  9. 苹果最新专利曝光:苹果可能正研发可折叠iPhone
  10. 什么是内容电商?核心是“内容”
  11. 推荐系统-Task01熟悉新闻推荐系统基本流程
  12. KVM虚拟化崛起:你选Ubuntu还是Red Hat?
  13. 简述人工智能的发展历程图_人工智能发展简史
  14. python数据分析库pandas官方教程
  15. 凡诺CMS 未授权访问+文件包含Getshell
  16. java获取系统dpi_Java DPI介绍
  17. redhat7图形界面网卡设置_初学Linux之配置网卡的四种方法
  18. 计算机科学与技术专业考研方向
  19. 单阶段目标检测重要论文总结
  20. 商丘工学院c语言试卷,商丘工学院New Radio82期:青春

热门文章

  1. 加速人生来帮忙,系统顺畅又洁净!
  2. Arduino与Proteus仿真实例-Nokia5110显示屏驱动仿真
  3. 基于javaweb+springboot的物流快递在线寄查快递系统(java+SpringBoot+FreeMarker+Mysql)
  4. 赞!整理了60 种常用可视化图表
  5. 常见的Linux的发行版本
  6. 安装屏保软件(Linux终端演示 “黑客帝国” 字母雨界面)和Linux修改管理员密码
  7. 解决设备管理器,控制面板中管理工具无法打开的问题
  8. 域名,主机名,网站名,URL
  9. 一文搞定vim,从安装到入门到精通,助你成功入门vim
  10. casio计算机有没有存储功能,哪些卡西欧计算器是不带储存功能?