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

一、基础理论:

  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 sum

def 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 sum

def difSquSum():#xi*yi平方总和 xi*yi
    sum =0
    for i in range(len(xx)):
        sum = xx[i]*yy[i]+sum
    return sum

def 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)#存x
print(xx)
save(5,0)#存y
print(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 = 0
plot.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)#存x
print(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)*m3
print(t)
结果:
[[ 0.25]
 [ 0.25]]
print(m1)
t =m1.T
print(t)
t = m1.T*m1
print(t)
t = t.I
print(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.0
0.2
0.4
0.6
0.8
[0.0, 0.2, 0.4, 0.6, 0.8]
# 存放实验数据。
存入Y 5 个数:,
0.9
1.9
2.8
3.3
4.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 sum

def 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 sum

def 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 sum

def 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 sum

def difSquSum():#xi*yi平方总和 xi*yi
    sum =0
    for i in range(len(xx)):
        sum = xx[i]*yy[i]+sum
    return sum

def difxxy():
    sum = 0
    for i in range(len(xx)):
        sum = xx[i]*xx[i]*yy[i]+sum
    return sum

def 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)#存x
print(xx)
save(7,0)#存y
print(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 个数:
1
2
3
4
6
7
8
[1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0]
存放实验数据
存入Y 7 个数:
2
3
6
7
5
3
2
[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 个数:
1
2
3
4
6
7
8
[1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0]
存放实验数据
存入Y 7 个数:
2
3
6
7
5
3
2
[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 实质同 残差方程多了项数 略)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值