训练数据为自变量的次实验值和因变量的次实验值,因此总的数据集为:
我们期望通过训练集得到回归模型(1)。当然,往往的结果是任何一组系数都不能使得计算结果和实测结果相符,因此我们只能退而求其次,使得误差最小。该式子通过矩阵偏导可以比较简单得到:
根据矩阵偏导公式我们可以得到(一个标准矩阵方程):
注意上述方程里面为了得到截距,我们对数据增加了一维,如果我们的数据已经中心化(零均值化)了,那么截距项可以就可以消去了。这也是我们经常要把数据中心化的原因。
from sklearn import linear_model
导入linear_model模块,然后创建一个线性模型linear_model.LinearRegression,该线性回归模型创建有几个参数(可以通过help(linear_model.LinearRegression)来查看):
1、fit_intercept:bool量,选择是否需要计算截距,默认为True,如果中心化了的数据可以选择false
2、normalize:bool量,选择是否需要标准化(中心化),默认为false,和参数fit_intercept有关,自行思考
3、copy_x:bool量,选择是否幅值X数据,默认True,如果否,可能会因为中心化把X数据覆盖
4、n_job:int量,选择几核用于计算,默认1,-1表示全速运行
其实这里面的参数基本都不怎么需要涉及,往往默认参数就够用。
from sklearn import linear_model
reg=linear_model.LinearRegression(fit_intercept=True,normalize=True)
然后就是训练数据,为方便可视化,我们可以用单变量单变量关系的线性回归来验证
from sklearn import linear_model
import matplotlib.pyplot as plt#用于作图
import numpy as np#用于创建向量
reg=linear_model.LinearRegression(fit_intercept=True,normalize=False)
x=[[1],[4],[5],[7],[8]]
y=[1.002,4.1,4.96,6.78,8.2]
reg.fit(x,y)
k=reg.coef_#获取斜率w1,w2,w3,...,wn
b=reg.intercept_#获取截距w0
x0=np.arange(0,10,0.2)
y0=k*x0+b
plt.scatter(x,y)
plt.plot(x0,y0)
得到的结果如上图所示。如果想要多变量线性关系,只需要将对应一维的x数据改一下即可,例如:
from sklearn import linear_model
reg=linear_model.LinearRegression(fit_intercept=True,normalize=False)
x=[[1,3],[4,2],[5,1],[7,4],[8,9]]
y=[1.002,4.1,4.96,6.78,8.2]
reg.fit(x,y)
k=reg.coef_#获取斜率w1,w2,w3,...,wn
b=reg.intercept_#获取截距w0
此时输入变量为二变量,输出为单变量,得到的系数k和b如下:
k=array([0.97588271, 0.03692946]),b=-0.011345504840941878
其他回归模型基本思想源于统计中的正则项,惩罚函数能够很好的约束我们的优化问题,但是如果矩阵本身比较病态,得到的解往往也比较病态,此时我们往往会考虑一个和优化解相关的项加入惩罚函数,如下几种方法都源于此:
sklearn.linear_model.Ridge:
sklearn.linear_model.ElasticNet:
对应的数学公式只需要矩阵偏导等于零就可以得到。