数值分析--线性多项以及多元最小二乘拟合python3实现并画图

来源:互联网 发布:oracle查询不重复数据 编辑:程序博客网 时间:2024/06/04 17:48

一、基础理论:

  1. 曲线拟合:字面意思
  2. 应用:预测和检验
  3. 方法:两种
    最小二乘法(数值不精确)
    插值法(数值精确,曲线过每个点)
    基础数学理论:
    泰勒级数(预测下一个函数值),有限差商,均值,标注差(方差开根),残差平方和,正态分布,置信区间
    数据特性:
    ①数据中心-算术平均
    ②分散度-标准差,方差,方差系数(标准差/均值)
    ③数据分布:正态
  4. 最小二乘回归之线性回归:
    首先直线/曲线拟合公式
    判断公式精确:
    残差值之和最小极为最佳公式
    残差值之和:
    直接相加?有绝对值抵消误差
    加绝对值相加?编程难以实现,存在多条
    残差的平方和—-最小二乘法
    判断最小:
    求偏导=0
  5. 扩展:直线-曲线-多元

  6. 偏导数:
    定义:针对函数的多元变量在各个方向上的变化率 保持一个变量对其他变量求导数 ;
    解题思路:定义法/先求偏导函数在带入具体点求解

  7. 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 实质同 残差方程多了项数 略)

原创粉丝点击