python简单线性回归、多项式回归(np.polyfit)、多元线性回归

文章目录

  • 1. 简单线性回归
    • (1)相关系数
    • (2)分析步骤
  • 2. 多项式回归
    • (1) poly1d(c_or_r, r=False, variable=None)
    • (2)np.polyfit(x,y,num) 多项式拟合
      • 例1
      • 例2
        • R平方
  • 3.多元线性回归
    • (1)标准化预处理函数
      • sklearn.preprocessing.scale()函数
      • sklearn.preprocessing.StandardScaler类
    • (2)多元线性回归
      • 根据汽车的体积和重量预测CO2的值
      • 扩展(波士顿房价预测)
        • 使用sklearn中的linear_model
        • 使用statsmodels

1. 简单线性回归

(1)相关系数

相关系数| ρXY |=0时,则称X,Y不相关; | ρXY |=1时,则称X,Y完全相关,此时,X,Y之间具有线性函数关系; 当| ρXY | < 1时,X的变动引起Y的部分变动,ρXY的绝对值越大,X的变动引起Y的变动就越大, | ρXY | > 0.8时称为高度相关,当 | ρXY|< 0.3时称为低度相关,其它时候为中度相关。

(2)分析步骤

  • 在进行回归分析是,可以先用plt.scatter(x,y) 初步观察一下数据是否具有线性关系;
  • 用scipy.stats.linregress进行线性回归得到各个参数;
  • 得到rvalue相关系数,判断x,y是否相关度如何;
from scipy import stats
import matplotlib.pyplot as plt
x=[5,7,8,7,2,17,2,9,4,11,12,9,6]
y=[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x,y)
slope,intercept,rvalue,pvalue,stderr=stats.linregress(x,y)
print("相关系数是",rvalue)
def myfunc(x):
    return slope*x+intercept
getmodel=list(map(myfunc,x)) #map()返回迭代器中参数运行函数后得到的迭代器
plt.plot(x,getmodel)

输出结果为:
python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第1张图片

2. 多项式回归

当用plt.scatter(x,y) 初步观察发现数据之间并不存在线性关系,此时我们可以选择多项式回归。接下来介绍一下多项式回归中用到的方法。

(1) poly1d(c_or_r, r=False, variable=None)

参数1:系数向量

import numpy as np
a=np.array([2,1,1])
f=np.poly1d(a)
print(f)
输出结果为:
  2
2 x + 1 x + 1

参数2:bool
表示把数组中的值作为根,然后反推多项式,例如:

f=np.poly1d([2,3,5],r=True)
print(f)

#(x - 2)*(x - 3)*(x - 5)  = x^3 - 10x^2 + 31x -30
#输出结果为:
   3      2
1 x - 10 x + 31 x - 30

参数3:字母
variable=‘z’表示改变未知数的字母,例如:

f=np.poly1d([2,3,5],r=True,variable='z')
print(f)
#输出结果为:
   3      2
1 z - 10 z + 31 z - 30

计算多项式的值:代入x

print(f([1,2,3,4]))
print(f(1))
#输出结果为:
[-8.  0.  0. -2.]
-8.0

f(0.5)表示当x = 0.5时,多项式的值为多少

f([1,2,3])表示当x = 1、2、3时,多项式的值分别为多少

f.r表示当多项式为 0 时,此等式的根root

f.c表示生成多项式的系数数组coefficients

f.order表示返回最高项的次方数

p[1]表示返回第一项的系数(次方数为1的项的系数)

p.deriv([m])表示求导derivative,参数m表示求几次导数

p.integ([m,k])表示积分,参数m表示积几次分,k表示积分后的常数项的值

两个多项式做差运算: np.polysub(a,b)

python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第2张图片

(2)np.polyfit(x,y,num) 多项式拟合

np.polyval(p,x)计算多项式的函数值。返回在x处多项式的值,p为多项式系数

例1

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
xu=np.random.rand(50)*4*np.pi-2*np.pi
def f(x):
    return np.sin(x)+0.5*x
yu=f(xu)
plt.figure(figsize=(8,6))

#得到拟合多项式系数,自由度5(最高次幂)
reg=np.polyfit(xu,yu,5)

#遍历xu的每个元素,得到多项式的值
ry=np.polyval(reg,xu)

plt.plot(xu,yu,'b^',label='f(x)')
plt.plot(xu,ry,'r.',label='regression')
plt.legend()

输出结果为:
python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第3张图片

例2

在下面的示例中,我们注册了18辆经过特定收费站的汽车。我们已经记录了汽车的速度和通过时间(小时)。
x轴表示一天中的小时,y轴表示速度

import matplotlib.pyplot as plt
import numpy as np
x=[1,2,3,5,6,8,9,10,12,13,14,15,16,18,19,21,22]
y=[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,100]
plt.scatter(x,y)
fit_y=np.polyval(np.polyfit(x,y,3),x)
plt.plot(x,fit_y)
print(np.poly1d(np.polyfit(x,y,3)))

输出结果为:
python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第4张图片

R平方

得到预估模型后,我们可以用R平方判断模型的拟合程度强不强,R平方的范围是0到1,其中0表示不相关,1表示相关。

from sklearn.metrics import r2_score
getmodel=np.poly1d(np.polyfit(x,y,3))
R_square=r2_score(y,getmodel(x))
print('R_square: {:.2f}'.format(R_square))  
#得到R平方接近1,该模型拟合度较强,可以用来预测
speed=getmodel(17)
print('17点过车速度: {:.2f}'.format(speed))
#输出结果为:
R_square: 0.94
17点过车速度: 83.95

3.多元线性回归

多元线性回归,有多个属性,多个属性的数据具有不同的值,甚至具有不同的度量单位时,可能很难比较它们,这时我们就需要对数据进行处理,使其生成可以对比的对象;这里介绍的数据预处理方法的公式为,(X-X_mean)/X_std,这里X_mean是均值,X_std是标准差。

(1)标准化预处理函数

sklearn.preprocessing.scale()函数

sklearn.preprocessing.scale()函数可以直接将给定数据进行标准。

from sklearn import preprocessing
import numpy as np
x=np.array([[1,-1,2],
           [2,0,0],
            [0,1,-1]])
x_scaled=preprocessing.scale(x)
print(x_scaled)
print(x_scaled.mean(axis=0))
print(x_scaled.std(axis=0))

#输出结果为:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
[0. 0. 0.]
[1. 1. 1.]

sklearn.preprocessing.StandardScaler类

使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。

#compute the mean and std to be used for later scalin
from sklearn import preprocessing
scaler=preprocessing.StandardScaler().fit(x)
print(scaler.mean_)
print(scaler.transform(x))
print(scaler.transform([[-1,1,0]]))

(2)多元线性回归

这里需要解释一下fit,fit_transform和transform:fit方法是用于从一个训练集中学习模型参数,其中就包括了归一化时用到的均值,标准偏差。transform方法就是用于将模型用于位置数据,fit_transform就很高效的将模型训练和转化合并到一起,训练样本先做fit,得到mean,standard deviation,然后将这些参数用于transform(归一化训练数据),使得到的训练数据是归一化的,而测试数据只需要在原先得到的mean,std上来做归一化就行了,所以用transform就行了。

根据汽车的体积和重量预测CO2的值

import pandas as pf
from sklearn.preprocessing import StandardScaler
from sklearn import linear_model
from sklearn.metrics import r2_score
f=open(r'C:\Users\USER\Desktop\python慕课课程文件\数据分析数据\cars.csv')
df=pd.read_csv(f)
x=df[['Volume','Weight']]
y=df['CO2']
#对数据进行标准化处理
scaler=StandardScaler()
scaledx=scaler.fit_transform(x)
#线性回归模型
method=linear_model.LinearRegression()
getmodel_1=method.fit(scaledx,y)
coef_,intercept_=getmodel_1.coef_,getmodel_1.intercept_
print('回归模型的系数为: {},截距为: {}'.format(coef_,intercept_))
#用R平方检验该模型的拟合度
predict_y=getmodel_1.predict(scaledx)
R_square=r2_score(y,predict_y)
print('R_square is: ',R_square)  #得到的值只有0.37,说明该模型不适合预估
#如果可行,就可以预估
scaled_test=scaler.transform([[1300,2300]])
predicted_co2=getmodel_1.predict(scaled_test)
print('预估的CO2: ',predicted_co2)

#输出的结果为:
回归模型的系数为: [2.99358608 1.80269333],截距为: 102.02777777777777
R_square is:  0.37655640436199866
预估的CO2:  [107.2087328]

数据长这样:
python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第5张图片

扩展(波士顿房价预测)

使用sklearn中的linear_model

import pandas as pd
from sklearn import datasets,linear_model
from sklearn.metrics import r2_score
import numpy as np
boston=datasets.load_boston()
x=pd.DataFrame(boston.data,columns=boston.feature_names)
y=pd.DataFrame(boston.target,columns=['MEDV'])
method=linear_model.LinearRegression()
getmodel=method.fit(x,y)
py=getmodel.predict(x)
r_square=r2_score(y,py)
print('R平方: {:.2f}'.format(r_square))
x_test=np.array([[0.005,16,2,0.0,0.7,6,70,4,1.0,297,16,398,5]])
print(method.predict(x_test))

#输出结果为:
R平方: 0.74
[[24.29494346]]

使用statsmodels

import pandas as pd
from sklearn import datasets
import statsmodels.api as sm
boston=datasets.load_boston()
x=pd.DataFrame(boston.data,columns=boston.feature_names)
y=pd.DataFrame(boston.target,columns=['MEDV'])
#statsmodels中的线性回归模型没有截距项,为其添加数据为1的特征
x_add1=sm.add_constant(x)
#sm.OLS普通最小二乘法回归模型,fit()进行拟合
model_1=sm.OLS(y,x_add1).fit()
print(model_1.summary())
#从模型中可以看到INDUS、AGE的p值大于0.05,无显著性意义,我们删除这两个属性重新建模

python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第6张图片

x.drop(['INDUS','AGE'],axis=1,inplace=True)
x_add1=sm.add_constant(x)
model_2=sm.OLS(y,x_add1).fit()
print(model_2.summary())

python简单线性回归、多项式回归(np.polyfit)、多元线性回归_第7张图片
得到模型后,可以通过.params查看系数:

print(model_2.params)

你可能感兴趣的:(python线性回归)