最小二乘拟合问题求解算法(含python代码)
1. 最小二乘拟合原理
参考西安交大数值分析教材
当f(x)是定义在点集X上的列表函数时,内积为
2. 最小二乘拟合问题的求解过程
最小二乘拟合问题的求解过程有三种方法
法一:
(1)根据问题的特点选择一组线性无关的基函数,
(2)解方正规方程组
(3)求得拟合函数
法二:
(1)利用三项递推关系式构造正交多项式
(2)由式5.2.11得到最小二乘拟合多项式
法三:
(1)做变量替换,利用已有的正交基函数构造最优平方逼近函数
(2)转到法二求解
3. python程序以及说明
本程序实现了上述的法一和法二,对于法一,程序选择了xk,(k=1,2,3 ……)作为基函数,然后使用改进平方根法求解正规方程组得到系数,最后利用系数构造拟合函数。对于法二,程序中使用最高项系数为1的正交多项式的三项递推关系构造正交基函数,然后通过式5.2.11求解系数。正交多项式的三项递推关系如下
python代码如下
import numpy as np
from sympy.abc import t
from sympy import simplifyclass LeastSquareFit():'''用于计算列表函数的最小二乘拟合输入参数:X:自变量列表Y:函数值列表n:多项式阶数JiFunction:基函数形式'''def __init__(self,X,Y,n,JiFunction='正交多项式'):self.x=np.array(X)self.y=np.array(Y)self.n=nself.w=self.myset_w(f=1) #设置权函数self.JiFunction=self.generate_JiFuction(n,JiFunction) #生成基函数self.c=[0]*(n+1) #初始化拟合多项式的系数#计算权函数def myset_w(self,f):if type(f) is int or float:y=[f]*len(self.x)else:y=[f.subs(t,x) for x in self.x]return y#生成正交基函数def generate_JiFuction(self,m,function_name):if function_name == '正交多项式':value_num=mg={}g[0]=1beta0=np.dot([(t*g[0]).subs(t,x) for x in self.x] , np.array(self.w)*([g[0]]*len(self.x)))gama0=np.dot([g[0]]*len(self.x) , np.array(self.w)*([g[0]]*len(self.x)))g[1]=t-beta0/gama0for k in range(1,value_num):beta=np.dot([(t*g[k]).subs(t,x) for x in self.x] , np.array(self.w)*[g[k].subs(t,x) for x in self.x])gama=np.dot([g[k].subs(t,x) for x in self.x] , np.array(self.w)*[g[k].subs(t,x) for x in self.x])if k==1:gama_pre=np.dot([g[k-1]]*len(self.x) , np.array(self.w)*([g[k-1]]*len(self.x)))else:gama_pre=np.dot([g[k-1].subs(t,x) for x in self.x] , np.array(self.w)*[g[k-1].subs(t,x) for x in self.x])b=beta/gamac=gama/gama_preg[k+1]=simplify((t-b)*g[k]-c*g[k-1])self.g=g#生成线性无关的x的k次方函数elif function_name == 'x^k': value_num=mg={}g[0]=1g[1]=tfor k in range(1,value_num):g[k+1]=t**(k+1)self.g=g#正交基函数正规方程组求解def ZhengJiao_solve_ck(self):for k in range(self.n+1):if k==0:c1=np.dot([self.g[k]]*len(self.x) , np.array(self.w)*self.y)c2=np.dot([self.g[k]]*len(self.x) , np.array(self.w)*([self.g[k]]*len(self.x)))else:c1=np.dot([self.g[k].subs(t,x) for x in self.x] , np.array(self.w)*self.y)c2=np.dot([self.g[k].subs(t,x) for x in self.x] , np.array(self.w)*[self.g[k].subs(t,x) for x in self.x])self.c[k]=c1/c2#最小二乘多项式正规方程组求解def ZXEC_solve_ck(self):#计算A和bG_pre=[]for key in self.g.keys():if key==0:passelse:G_pre.append(self.g[key])G1=[[g.subs(t,x) for g in G_pre] for x in self.x]one_temp=np.ones(len(self.x))one_temp=one_temp.reshape(len(self.x),1)G2=np.c_[one_temp,G1]G=np.array(G2)W=np.diag(self.w)A_temp=np.dot(G.T,W)A=np.dot(A_temp,G)b=np.dot(np.dot(G.T,W),self.y)#LDLT分解L,U=self.my_LU(A)D=np.diag(U)D=np.diag(D)#解yy={}y[0]=b[0]for i in range(1,self.n+1):Ly=[L[i][k]*y[k] for k in range(0,i)]sum_Ly=sum(Ly)y[i]=b[i]-sum_Ly#解xx={}x[self.n]=y[self.n]/U[self.n][self.n]for j in range(self.n-1,-1,-1):Ux=[U[j][k]*x[k] for k in range(j+1,self.n+1)]sum_Ux=sum(Ux)x[j]=(y[j]-sum_Ux)/U[j][j]#将x变为cfor i in range(len(x)):self.c[i]=x[i]#LU分解def my_LU(self,A):A=np.asarray(A)U=np.zeros_like(A)L=np.zeros_like(A)U[0,:]=A[0,:]L[1:A.shape[0],0]=A[1:A.shape[0],0]/U[0][0]for i in range(1,A.shape[0]-1):U[i][i]=A[i][i]-sum([L[i][k]*U[k][i] for k in range(0,i)])for j in range(i+1,A.shape[1]):U[i][j]=A[i][j]-sum([L[i][k]*U[k][j] for k in range(0,i)])L[j][i]=(A[j][i]-sum([L[j][k]*U[k][i] for k in range(0,i)]))/U[i][i]U[A.shape[0]-1][A.shape[1]-1]=A[A.shape[0]-1][A.shape[1]-1]-\sum([L[A.shape[0]-1][k]*U[k][A.shape[1]-1] for k in range(0,A.shape[1]-1)])for i in range(L.shape[0]):L[i][i]=1return L,U #计算逼近多项式def solve_pn(self):pn=[]for k in range(self.n+1):pn.append(simplify(self.c[k]*self.g[k]))result=0for p in pn:result=result+preturn simplify(result)#计算误差def LeastSquareFit_error(self):y_pn=self.solve_pn()e=0for index,value in enumerate(self.x):temp=abs(y_pn.subs(t,value)-self.y[index])e=e+temp**2return pow(e,0.5)######################测试程序####################
if __name__ == "__main__":#------------------使用正交多项式---------------------# X=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]# Y=[5.1234, 5.3057, 5.5687, 5.9375, 6.4370, 7.0978, 7.9493, 9.0253, 10.3627]# test=LeastSquareFit(X,Y,4,JiFunction='正交多项式')# test.myset_w(f=1) #设置权函数# test.ZhengJiao_solve_ck() #求解系数c# print("多项式系数", test.c)# result=test.solve_pn() #求解拟合的多项式# print("拟合多项式", result)# my_error=test.LeastSquareFit_error() #计算误差# print("误差为:", my_error)#------------------使用x^k---------------------------X = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]Y = [5.1234, 5.3057, 5.5687, 5.9375, 6.4370, 7.0978, 7.9493, 9.0253, 10.3627]test=LeastSquareFit(X,Y,4,JiFunction='x^k')test.myset_w(f=1) #设置权函数test.ZXEC_solve_ck() #求解多项式系数cprint("多项式系数", test.c)result=test.solve_pn() #求解拟合的多项式print("拟合多项式", result)my_error=test.LeastSquareFit_error() #计算误差print("误差为:", my_error)
4. 程序使用说明
首先给定输入数据X和Y,然后确定多项式阶数比如4,最后选择基函数,可选“正交基函数”或“x^k”。确定完参数后,具体使用步骤为:(1)类实例化;(2)调用myset_w()设置权函数;(3)调用ZXEC_solve_ck()(或ZhengJiao_solve_ck())求解多项式系数;(4)调用solve_pn()生成拟合多项式;(5)调用LeastSquareFit_error()计算误差。
最小二乘拟合问题求解算法(含python代码)相关推荐
- 12种降维方法终极指南(含Python代码)
12种降维方法终极指南(含Python代码) 你遇到过特征超过1000个的数据集吗?超过5万个的呢?我遇到过.降维是一个非常具有挑战性的任务,尤其是当你不知道该从哪里开始的时候.拥有这么多变量既是一个 ...
- 一文看懂Stacking!(含Python代码)
一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ 转载于:https://www.cnblogs.c ...
- 感知机算法之Python代码实现
感知机算法之Python代码实现 1.算法简介 感知机学习算法原始形式: 输入:训练集T 输出:w,b 感知机模型:f(x)=sign(w·x+b) 算法步骤: 1.初始化参数w0,b0 2.在训练集 ...
- BPR贝叶斯个性化推荐算法—推荐系统基础算法(含python代码实现以及详细例子讲解)
BPR贝叶斯个性化排序算法 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式反馈与隐式反馈的比较 2.3 显式反馈与隐式反馈的评价方法 2.3.1 显式反馈数据模 ...
- 密码学——保序加密算法(OPE算法-2009年提出)通俗易懂解析(小学生都能懂!)含python代码
一. 预备知识 保序加密算法:最初是由2009年,Boldyreva等四个人提出来的,可简称BCLO-09算法,论文题目为<Order-Preserving Symmetric Encrypti ...
- 如何用机器学习算法来进行电影分类?(含Python代码)
电影分析--K近邻算法 周末,小迪与女朋友小西走出电影院,回味着刚刚看过的电影. 小迪:刚刚的电影很精彩,打斗场景非常真实,又是一部优秀的动作片! 小西:是吗?我怎么感觉这是一部爱情片呢?真心被男主女 ...
- 图解匈牙利算法(含python代码)
文章目录 分配问题 匈牙利算法 算法步骤 算法实现 python版本 C++版本 分配问题 分配问题/指派问题(Assignment Problem)作为线性规划问题的一个特例,在运筹学研究中占有重要 ...
- 算法笔记(11)逻辑回归算法及Python代码实现
逻辑回归算法是一种被广泛使用的分类算法,通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数.逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布. 因此与线性回归 ...
- 决策树模型 - (ID3算法、C4.5算法) - Python代码实现
目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...
- 维吉尼亚密码的破解算法及python代码实现
目录 1. 密文描述 1.1 密文1 1.2 密文2 2. 破解原理 2.1 重合指数法确定密钥长度 2.2 互重合指数确定子串间相对偏移 2.3 密钥字的确定 2.4 密文破解 3. 破解代码 参考 ...
最新文章
- 从零入门 FreeRTOS 操作系统之创建任务流程
- 【国内首家!】阿里云专有云通过商用密码应用安全性评估
- java输入流读取几行文本_Java基础笔记Day_16
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
- 使用C#和Excel进行报表开发(五)-操作单元格边框和颜色 【转】
- layui表单的ajax联动,layui的select联动实现代码
- 茄子快传 java,如何打造茄子快传这样一款Android应用(项目已完成,github)
- AI项目商务合作,寻广州附近计算机视觉算法团队!
- 有关cookie实现统计pv,uv的一些用法
- oracle kill行锁,Oracle kill 锁表
- Ubuntu部署python3.7的开发和运行环境
- pe修改rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...
- 【WINDOWS / DOS 批处理】添加注释
- python单行注释和多行注释分别用什么表示_Python多行注释和单行注释用法详解
- c++ 获取外网ip地址
- Activity5概述
- Essay-编程语言排行榜2013年10月:Groovy首次闯入前二十
- python 计算箱线图、中位数、上下四分位数等
- 有趣的海盗分金币问题
- Mac系统打开命令行终端及查看操作系统版本号的方法
热门文章
- 双色球历史数据下载最新2003年2021年
- 与众不同的协同办公工具——飞书
- 获取农历时间(几月初几)
- 无人机和地面三维激光扫描仪在1:500城市基本地形图测绘中的应用
- 手把手教你申请CSDN博客专家(2021新鲜出炉)
- asp.net 将bmp格式图片怎么转换为jpg_如何把jpeg转换成jpg?分享两种jpeg转换jpg的方法...
- java手机飞信_手机飞信JAVA通用版 手机飞信2011通用版
- Linux过时了- 塔能鲍姆-托瓦兹辩论(Tanenbaum–Torvalds debate)
- 冰桶算法,优质资源稳守宝座
- 关于导入百度导航SDK报错以及解决方案