若给定了1-9月份数据要预测10-12月份销量数据,可运用多项式拟合进行预测
1.导入模块
import numpy as np
import matplotlib.pyplot as plt
2.导入1-9月份销量的值
xu=np.array([1,2,3,4,5,6,7,8,9])
yu=np.array([1,3,5,7,9,11,14,18,22]) # np.array([, , , , ,]) ← 使list可计算
3.求拟合系数,并赋值给reg
reg=np.polyfit(xu,yu,2) #np.ployfit(x值,y值,几次方相关)
4.求10-12月份销量的值,ry为拟合系数*Xu(自变量)
ry10=np.polyval(reg,10)
ry11=np.polyval(reg,11)
ry12=np.polyval(reg,12) # np.ployval(拟合系数,自变量值)
5.预测了10-12月份销量数据
一、单变量拟合
1.导入模块
import numpy as np
import matplotlib.pyplot as plt
2.定义xu ,yu
xu= np.arange(10)
def f(x):
return 0.5*x*x -2.5 * x -10
yu=f(xu)
3.求拟合系数并赋值给reg,并根据多项式系数和自变量,计算拟合结果ry
reg=np.polyfit(xu,yu,2) # 拟合出的多项式系数=reg 假定自变量xu的最高次幂为2次方
ry=np.polyval(reg,xu) # 根据多项式系数和自变量,计算拟合结果ry=reg * xu 反推 新的y值拟合
4.对数据加以验证
plt.figure(1) #创建画板
plt.plot(xu,yu,'b-',label='f(x)') #作出原数据图案 b:蓝色 ^:实线
plt.plot(xu,ry,'r.',label='regression') #作出拟合数据图案 r:红色 .:点
plt.legend(loc=0) #添加图例
plt.grid(True) #显示网格线
plt.xlabel('x') #x轴标题
plt.ylabel('f(x)') #y轴标题
plt.show() #绘制图形
由图形可知函数原始值yu与拟合结果ry的重合度(相似度)较高
5.确定拟合误差大小并绘图
e = yu - ry # 看拟合误差e的大小
plt.figure(2)
plt.plot(xu,e,'b^',label='error')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('e')
plt.show()
由于e的值是10-14次方,可以看出原始数据经过回归后,拟合值与原始值有较好的拟合
二、多变量拟合
1.导入模块
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
(2.定义Z1,Z2 ,Y(从3开始验证多项式拟合))
theta = np.arange(11)
Z1 = np.sin(theta*9/57.3)
Z2 = np.cos(theta*9/57.3)
Z0 = 0.5;
a = 2;
b = 3;
Y = 0.5 + 2 * Z1 + 3 * Z2
3.读取var2.csv数据,并求拟合系数
(唯一要注意的是,构造原始的Z矩阵时,需要在Z矩阵中新增第一列,且第一列对应的每一行的值都设为1,这是多变量线性回归算法的特定需要
以及第一行默认作为标题)
data = pd.read_csv('var2.csv')
x = data.iloc[:,0:3] #选取自变量x对应的数据 iloc是左闭右开 0:3对应的是a,z1,z2列
y = data.iloc[:,3] #选取因变量y对应的数据 3对应的是y列
a = x.T # x转置,变成a
b = np.dot(a,x) # np.dot(a,x)代表矩阵a 乘以 矩阵x,结果=b
c = np.linalg.inv(b) # np.linalg.inv(b)对矩阵b求逆,结果=c
d = np.dot(a,y) # np.dot(a,y)矩阵a 乘以 矩阵y,结果=d
beta = np.dot(c,d) # np.dot(c,d)矩阵c 乘以 矩阵d,结果=beta,即多项式拟合系数在beta中
得到beta为[0.5,2,3]与原始值的系数基本一致
4.检验拟合值的准确性和拟合误差
x1 = x.iloc[:,1] #取自变量x的第1列数据
x2 = x.iloc[:,2] #取自变量x的第2列数据
# 用多项式拟合系数beta * 对应的自变量,试图还原y,拟合结果=y1
y1 = beta[0] + beta[1] * x1 + beta[2] * x2
e = y - y1 #计算拟合误差e
并绘图
n = theta # 给坐标轴的横轴赋值n
plt.figure(1)
plt.xlabel("theta/9",labelpad = 10)
plt.ylabel("Y&Y1",labelpad = 10)
plt.grid(b = "Ture")
plt.plot(n,y,'-o',n,y1,'-*') #原始值y和拟合值y1对比显示
plt.figure(2)
plt.xlabel("theta/9",labelpad = 10)
plt.ylabel("error",labelpad = 10)
plt.grid(b = "Ture")
plt.plot(n,e,'-*') #显示拟合误差e
由图可知,拟合值y1与原始值y几乎是重合的。
e的拟合误差几乎为零,说明拟合的精度是很高的。
拟合系数在beta中,其具体数值是:0.500007,2,2.99999,与程序中语句Y = Z0 + a * Z1 + b * Z2对应的系数0.5,2,3极其接近。