python-sklearn学习笔记 第一节 linear_model

一、最小二乘模型

\large {\color{Red} y=\omega _0+\omega_1x_1+\omega_2x_2+...+\omega_nx_n} (1)

训练数据为自变量x=(1,x_1,x_2,x_3,...,x_n)m次实验值和因变量ym次实验值,因此总的数据集为:

X:m\times (n+1)

y:m\times 1

我们期望通过训练集得到回归模型(1)。当然,往往的结果是任何一组系数\omega =(\omega_0,\omega_1,\omega_2,...,\omega_n)都不能使得计算结果和实测结果相符,因此我们只能退而求其次,使得误差\small \left \| X\omega -y \right \|_2最小。该式子通过矩阵偏导可以比较简单得到:

\small \partial (X\omega-y)^T(X\omega-y)/\partial \omega =0

根据矩阵偏导公式我们可以得到(一个标准矩阵方程):

\small X^TX\omega =X^Ty

注意上述方程里面为了得到截距\omega_0,我们对数据增加了一维,如果我们的数据已经中心化(零均值化)了,那么截距项可以就可以消去了。这也是我们经常要把数据中心化的原因。

二、sklearn.linear_model.LinearRegression实现

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)

python-sklearn学习笔记 第一节 linear_model_第1张图片

得到的结果如上图所示。如果想要多变量线性关系,只需要将对应一维的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其他回归实现

其他回归模型基本思想源于统计中的正则项,惩罚函数\small L=\left \| Xw-y \right \|_2能够很好的约束我们的优化问题,但是如果矩阵本身比较病态,得到的解往往也比较病态,此时我们往往会考虑一个和优化解相关的项加入惩罚函数,如下几种方法都源于此:

sklearn.linear_model.Ridge:\small L=\left \| X\omega-y \right \|_2^2+\alpha\left \| \omega \right \|_2^2

sklearn.linear_model.Lasso:\small L=\frac{1}{2n_{sample}}\left \| X\omega-y \right \|_2^2+\alpha\left \| \omega \right \|_1

sklearn.linear_model.ElasticNet:\small L=\frac{1}{2n_{sample}}\left \| X\omega-y \right \|_2^2+\alpha\rho\left \| \omega \right \|_1+\frac{\alpha(1-\rho)}{2}\left \| \omega \right \|_2^2

对应的数学公式只需要矩阵偏导等于零就可以得到。

 

你可能感兴趣的:(python学习)