数值分析--线性多项以及多元最小二乘拟合python3实现并画图
来源:互联网 发布:oracle查询不重复数据 编辑:程序博客网 时间:2024/06/04 17:48
一、基础理论:
- 曲线拟合:字面意思
- 应用:预测和检验
- 方法:两种
最小二乘法(数值不精确)
插值法(数值精确,曲线过每个点)
基础数学理论:
泰勒级数(预测下一个函数值),有限差商,均值,标注差(方差开根),残差平方和,正态分布,置信区间
数据特性:
①数据中心-算术平均
②分散度-标准差,方差,方差系数(标准差/均值)
③数据分布:正态 - 最小二乘回归之线性回归:
首先直线/曲线拟合公式
判断公式精确:
残差值之和最小极为最佳公式
残差值之和:
直接相加?有绝对值抵消误差
加绝对值相加?编程难以实现,存在多条
残差的平方和—-最小二乘法
判断最小:
求偏导=0 扩展:直线-曲线-多元
偏导数:
定义:针对函数的多元变量在各个方向上的变化率 保持一个变量对其他变量求导数 ;
解题思路:定义法/先求偏导函数在带入具体点求解- python:
http://blog.csdn.net/taoyanqi8932/article/details/52703686 矩阵实现
二、代码实现
from numpy import*;#导入numpy库函数import numpy as np;#使用np函数用np.开头import matplotlib.pyplot as plt # 图形库
1.python直线拟合
print('题目试验数据:')print('xi[0.0,0.2,0.4,0.6,0.8]')print('yi[0.9,1.9,2.8,3.3,4.2]')print('用最小二乘法拟合直线:')print('*********************************************')xx = []#存放X值yy = []#存放Y值def save(t,flag):#t代表存放x值个数 flag标志存储x/y print('存放实验数据') if flag ==1: print('存入X',t,'个数:') for i in range(t):#for循环 a=input() xx.append(float(a))#强制转化 python只支持三种类型:int float complex elif flag ==0: print('存入Y', t, '个数:') for i in range(t): b=input() yy.append(float(b)) else: print('输出flag有误!')def m ():#计算方程个数 0-0 return len(xx)def Sum(flag):#计算X/Y的总和 xi/yi sum =0 #能局部不全局 for i in range(len(xx)): if flag == 1: sum = xx[i]+ sum else: sum = yy[i]+ sum return sumdef squSum(flag):#x_y平方的总和 xi*xi /yi*yi sum =0 for i in range(len(xx)): if flag == 1: sum = xx[i] * xx[i] + sum else: sum = yy[i] * yy[i] + sum return sumdef difSquSum():#xi*yi平方总和 xi*yi sum =0 for i in range(len(xx)): sum = xx[i]*yy[i]+sum return sumdef result(m1,m3):#进行系数计算 t = (((m1.T * m1).I) * m1.T) * m3 return t#创建矩阵 线性 4*4 多元m1 = mat([[0.0,0.0],[0.0,0.0]])#创建2*2矩阵 存m,xi,xi,xi*xi#float=m1.dtype 矩阵元素类型确定 在初始化的时候规定 元素类型必须相同m3 = mat([[0.0],[0.0]])#存 yi之和 xiyi乘积之Result = mat([[0.0],[0.0]])#存储结果#mat1=mat()#对应函数值存放进矩阵save(5,1)#存xprint(xx)save(5,0)#存yprint(yy)m1[0,0]=m()m1[0,1]=Sum(1)m1[1,0]=Sum(1)m1[1,1]=float(squSum(1))print(squSum(1))print(m1)m3[0,0]=Sum(0)m3[1,0]=difSquSum()print(m3)Result = result(m1,m3)print(result(m1,m3))#矩阵运算x = 0plot.title("line Least squares polynomial ")x = np.linspace(0,3)plot.xlim(0,4)plot.plot(x,Result[0,0]+Result[1,0]*x)plot.scatter(xx,yy,c='m')plot.show()"""save(5,1)#存xprint(x)#save(5,0)#存y#print(y)print(m())#方程个数print(sum(1))#X的和print(squSum(1))#X平方和print(difSquSum(1))#x*y的平方和"""#t = mat(ones(3,3))#print(t)"""m1 = mat([[1, -1], [1, 1],[1,1]]) # 创建2*2矩阵 存m,xi,xi,xi*xi 三行两列m3 = mat([[0],[1],[0]]) # 存 yi之和 xiyi乘积之和t = (((m1.T*m1).I)*m1.T)*m3print(t)结果:[[ 0.25] [ 0.25]]print(m1)t =m1.Tprint(t)t = m1.T*m1print(t)t = t.Iprint(t)print(3/8)结果:[[ 1 -1] [ 1 1] [ 1 1]][[ 1 1 1] [-1 1 1]][[3 1] [1 3]][[ 0.375 -0.125] [-0.125 0.375]]0.375""""""最终结果:存放实验数据存入X 5 个数:0.00.20.40.60.8[0.0, 0.2, 0.4, 0.6, 0.8]# 存放实验数据。存入Y 5 个数:,0.91.92.83.34.2[0.9, 1.9, 2.8, 3.3, 4.2]1.2000000000000002[[ 5. 2. ] [ 2. 1.2]][[ 13.1 ] [ 6.84]][[ 1.02] [ 4. ]]Process finished with exit code 0"""
2.python曲线(多项式)拟合
print('实例数据表:')print('xi[1,2,3,4,6,7,8]')print('yi[2,3,6,7,5,3,3]')print('用最小二乘法求二次拟合多项式:')print('*************************************')xx = []#存放X值yy = []#存放Y值def save(t,flag):#t代表存放x值个数 flag标志存储x/y print('存放实验数据') if flag ==1: print('存入X',t,'个数:') for i in range(t):#for循环 a=input() xx.append(float(a))#强制转化 python只支持三种类型:int float complex elif flag ==0: print('存入Y', t, '个数:') for i in range(t): b=input() yy.append(float(b)) else: print('输出flag有误!')def m ():#计算方程个数 0-0 return len(xx)def Sum(flag):#计算X/Y的总和 xi/yi sum =0 #能局部不全局 for i in range(len(xx)): if flag == 1: sum = xx[i]+ sum else: sum = yy[i]+ sum return sumdef squSum(flag):#x_y平方的总和 xi*xi /yi*yi sum =0 for i in range(len(xx)): if flag == 1: sum = xx[i] * xx[i] + sum else: sum = yy[i] * yy[i] + sum return sumdef cubeSum(flag):#三次方和相加 sum=0 for i in range(len(xx)): if flag==1: sum =sum+xx[i]*xx[i]*xx[i] else: sum = sum+yy[i]*yy[i]*yy[i] return sumdef biquSum(flag):#四次方和相加 sum = 0 for i in range(len(xx)): if flag == 1: sum = sum + xx[i] * xx[i] * xx[i]*xx[i] else: sum = sum + yy[i] * yy[i] * yy[i]*yy[i] return sumdef difSquSum():#xi*yi平方总和 xi*yi sum =0 for i in range(len(xx)): sum = xx[i]*yy[i]+sum return sumdef difxxy(): sum = 0 for i in range(len(xx)): sum = xx[i]*xx[i]*yy[i]+sum return sumdef result(m1,m3):#进行系数计算 t = (((m1.T * m1).I) * m1.T) * m3 return t#创建矩阵 线性 4*4 多元m1 = mat([[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]])#创建2*2矩阵 存m,xi,xi,xi*xi#float=m1.dtype 矩阵元素类型确定 在初始化的时候规定 元素类型必须相同m3 = mat([[0.0],[0.0],[0.0]])#存 yi之和 xiyi乘积之Result=mat([[0.0],[0.0],[0.0]])#存储a0,a1,a2#mat1=mat()#对应函数值存放进矩阵save(7,1)#存xprint(xx)save(7,0)#存yprint(yy)m1[0,0]=m()m1[0,1]=Sum(1)m1[0,2]=squSum(1)m1[1,0]=Sum(1)m1[1,1]=squSum(1)m1[1,2]=cubeSum(1)m1[2,0]=squSum(1)m1[2,1]=cubeSum(1)m1[2,2]=biquSum(1)print(squSum(1))print(m1)m3[0,0]=Sum(0)m3[1,0]=difSquSum()m3[2,0]=difxxy()print(m3)print(result(m1,m3))Result = ow()"""实例数据表:xi[1,2,3,4,6,7,8]yi[2,3,6,7,5,3,3]用最小二乘法求二次拟合多项式:*************************************存放实验数据存入X 7 个数:1234678[1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0]存放实验数据存入Y 7 个数:2367532[2.0, 3.0, 6.0, 7.0, 5.0, 3.0, 2.0]179.0[[ 7.00000000e+00 3.10000000e+01,7,8]yi[2,3,6,7,5,3,3]用最小二乘法求二次拟合多项式:*************************************存放实验数据存入X 7 个数:1234678[1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0]存放实验数据存入Y 7 个数:2367532[2.0, 3.0, 6.0, 7.0, 5.0, 3.0, 2.0]179.0[[ 7.00000000e+00 3.10000000e+0 1.79000000e+02] [ 3.10000000e+01 1.79000000e+02 1.17100000e+03] [ 1.79000000e+02 1.17100000e+03 8.14700000e+03]][[ 28.] [ 121.] [ 635.]][[-1.31818182] [ 3.43181818] [-0.38636364]]Process finished with exit code 0"""
3.python多元拟合(一个Y对应多个X 实质同 残差方程多了项数 略)
阅读全文
0 0
- 数值分析--线性多项以及多元最小二乘拟合python3实现并画图
- 最小二乘线性拟合
- 最小二乘线性拟合
- Matlab直线最小二乘拟合实现
- 最小二乘拟合-python scipy实现
- 最小二乘拟合
- 最小二乘拟合
- 最小二乘拟合
- 关于Matlab中的线性与非线性最小二乘拟合
- 多元最小二乘问题
- 什么是最小二乘拟合
- 最小二乘拟合线
- 最小二乘拟合详解
- 最小二乘拟合平面
- 最小二乘椭圆拟合
- 数值计算——线性最小二乘问题
- 线性最小二乘
- 用matlab的右除实现最小二乘拟合
- NDK 开发(一:基本流程入门了解)
- MySQL支持的数据类型
- 动态执行python代码
- DES详解
- 第5章设置开发板的IP地址
- 数值分析--线性多项以及多元最小二乘拟合python3实现并画图
- java 实现两个变量的互换(不借助第三个变量,即中间变量、临时变量)
- 108. Convert Sorted Array to Binary Search Tree
- maven配置tomcat插件
- Ip地址正则表达式
- 从零开始前端学习[39]:html5中的弹性布局二(移动端响应式实现各种布局,极其重要)
- git笔记四
- Qt:TreeWidget(树控件)的简单操作
- 博客已迁移到 Eternalxc 独立站点,欢迎访问!