多变量线性回归/多项式拟合

若给定了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

y与y1对比
拟合误差

由图可知,拟合值y1与原始值y几乎是重合的。

e的拟合误差几乎为零,说明拟合的精度是很高的。

拟合系数在beta中,其具体数值是:0.500007,2,2.99999,与程序中语句Y = Z0 + a * Z1 + b * Z2对应的系数0.5,2,3极其接近。

你可能感兴趣的:(多变量线性回归/多项式拟合)