多项式函数曲线拟合——最小二乘法
多项式函数拟合的任务是假设给定数据由M次多项式函数生成,选择最有可能产生这些数据的M次多项式函数,即在M次多项式函数中选择一个对已知数据以及未知数据都有很好预测能力的函数。
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
设训练数据集为:
其中,是输入x的观测值,是相应的输出y的观测值,i=1,2,⋯,N
设M次多项式为
其中,x是单变量输入,是M+1个参数。
用平方损失作为损失函数(即最小二乘法),系数是为了方便计算,将模型与训练数据代入,有:
对wj求偏导并令其为0
以上公式最后一步存在一处错误:等式左边x指数为(j+k)
所以要求拟合多项式系数需要解下面这个线性方程组,下面的求和符号上下限都是i=1到N,为了方便略去不写。
所以计算出
然后将这些值带入上述线性方程组求解即可。
Python实现:
'''多项式:yi = w0 + w1*xi^1 + w2*xi^2 + ... + wn*xi^mN为数据点个数,M为阶数先用数据点(xa、ya)求出未知参数,然后用参数带入后的公式求解给定值(xxa)
'''
import matplotlib.pyplot as plt
import numpy
import randomfig = plt.figure()
ax = fig.add_subplot(111)# 在这里给出拟合多项式的阶数
order = 9# 1. 生成曲线上的各个点
x = numpy.arange(-1,1,0.02)
y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x] # y=[(x^2-1)^3]*sin(2x),阶数为6???# ax.plot(x,y,color='r',linestyle='-',marker='')
# ,label="(a*a-1)*(a*a-1)*(a*a-1)+0.5"
plt.plot(x,y,c='red')# 2. 生成的曲线上的各个点偏移一下,并放入到x_data,y_data中去
i=0
x_data=[]
y_data=[]
for xx in x:yy=y[i]d=float(random.randint(60,140))/100#ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')i+=1x_data.append(xx*d)y_data.append(yy*d)ax.plot(x_data,y_data,color='m',linestyle='',marker='.')# 3. 计算Ax=b中,矩阵A、b
# 存储从0次到m次的所有冥方和
bigMat=[]
for j in range(0, 2*order+1):sum = 0for i in range(0,len(xa)):sum += (xa[i]**j)bigMat.append(sum)# 计算线性方程组系数矩阵:A
matA=[]
for rowNum in range(0,order+1):row=bigMat[rowNum:rowNum+order+1]matA.append(row)matA=numpy.array(matA)matB=[]
for i in range(0,order+1):ty=0.0for k in range(0,len(xa)):ty+=ya[k]*(xa[k]**i)matB.append(ty)matB=numpy.array(matB)matW=numpy.linalg.solve(matA,matB)
# numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量# 画出拟合后的曲线
# print(matW)
x_ = numpy.arange(-1,1.06,0.01)
y_ =[]
for i in range(0,len(xxa)):yy=0.0for j in range(0,order+1):dy = (x_[i]**j)*matW[j]# dy*=matW[j]yy += dyy_.append(yy)
ax.plot(x_,y_,color='g',linestyle='-',marker='')ax.legend()
plt.show()
拟合结果曲线:
阶数=9
阶数 = 5 :
阶数 = 3:
参考:
https://wenku.baidu.com/view/9d21ed6bdc36a32d7375a417866fb84ae45cc3b9.html
多项式函数曲线拟合——最小二乘法相关推荐
- MATLAB多项式函数拟合和曲线拟合
MATLAB软件提供了基本的曲线拟合函数的命令. 多项式函数拟合:a=polyfit(xdata,ydata,n) 其中n表示多项式的最高阶数,xdata,ydata为将要拟合的数据,它是用数组的方式 ...
- python多项式拟合_最小二乘法—多项式拟合非线性函数
本章涉及到的知识点清单: 1.函数的近似表示-高次多项式 2.误差函数-最小二乘法 3.引出案例函数曲线 4.目标函数 5.优化目标函数 6.优化目标函数-梯度下降法 7.优化目标函数-求解线性方程组 ...
- 多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合
matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用. 多项式函数主要有: roots 求多项式的根 ...
- 曲线拟合最小二乘法优缺点_Matlab曲线拟合 最小二乘法 polyfit(转)
Matlab曲线拟合 最小二乘法 polyfit 2009-04-07 19:04 曲线拟合 已知离散点上的数据集 ,即已知在点集 上的函数值 ,构造一个解析函数(其图形为一曲线)使 在原离散点 上尽 ...
- Python对自定义离散点进行指定多项式函数拟合
自定义离散点进行指定多项式函数拟合 用户自己自己输入坐标点,拟合函数可根据用户输入的多项式的最高次方进行自动拟合函数,拟合方法采用最小二乘法进行函数拟合. (1,2),(2,5),(3,10),(4, ...
- 多项式拟合 java_最小二乘法多项式拟合的Java实现
背景由于项目中需要根据磁盘的历史使用情况预测未来一段时间的使用情况,决定采用最小二乘法做多项式拟合,这里简单描述下: 假设给定的数据点和其对应的函数值为 (x1, y1), (x2, y2), ... ...
- python多项式拟合_Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合。如 电...
Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合.如 电 多元函数拟合.如 电视机和收音机价格多销售额的影响,此时自变量有两个. python 解法:imp ...
- 数值分析习题3/多项式的曲线拟合
3 次.4 次.指数多项式的曲线拟合 3 次多项式的曲线拟合程序 x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]; y=[1.0 0.41 0.50 0.61 0.91 2.02 2. ...
- 曲线拟合最小二乘法C实现
曲线拟合最小二乘法C实现 #include "math.h"void pir1(x,y,n,a,m,dt)int n,m;double x[],y[],a[],dt[];{ int ...
最新文章
- R语言str_starts函数和str_ends函数检查在字符串的开头或者结尾是否存在特定字符串或者字符串模式
- 卫星系统采用的轨道类型
- Android Handler机制
- 案例 github_2019年12月Github上最热门的Java开源项目,速来围观!
- Facebook史上最严重宕机:互联网企业是时候重新审视架构了?
- python 匿名函数装饰器
- 2022年新版YOLO解读(PP-YOLOE)
- 将keras的模型封装成可转换为tensorlow的.pb格式,并生成.pbtxt文件
- String 类的常用方法
- 常用Linux命令行技巧
- Downward API,它的作用是:让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。
- 一维条形码 code128 的全面介绍
- 使用kubeadm部署k8s(2、k8s集群部署)
- 自动化测试的定位以及一些思考是什么样的,你知道吗?
- 局部动态地图(LDM)的介绍
- PCIe扫盲系列博文连载目录
- C++11 新特性。
- python统计套利_统计套利(二),利用协整关系进行配对交易【原文】
- CSS 3D转换和动画
- 创新型中药制药企业苏轩堂将在纳斯达克挂牌交易