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