使用最小二乘法求解回归系数W:

求解W:[对W求导,当导数为零时,平方误差最小,此时W=]

参数

class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)

fit_intercept:布尔型,默认为true

说明:是否对训练数据进行中心化。如果该变量为false,则表明输入的数据已经进行了中心化,在下面的过程里不进行中心化处理;否则,对输入的训练数据进行中心化处理

normalize:布尔型,默认为false

说明:是否对数据进行标准化处理

copy_X :布尔型,默认为true

说明:是否对X复制,如果选择false,则直接对原数据进行覆盖。(即经过中心化,标准化后,是否把新数据覆盖到原数据上)

n_jobs:

说明:计算时设置的任务个数(number of jobs)。如果选择-1则代表使用所有的CPU。这一参数的对于目标个数>1(n_targets>1)且足够大规模的问题有加速作用。

返回值

coef_ :

说明:对于线性回归问题计算得到的feature的系数。如果输入的是多目标问题,则返回一个二维数组(n_targets, n_features);如果是单目标问题,返回一个一维数组(n_features,)。

intercept_ :数组型变量

说明:线性模型中的独立项。

:该算法仅仅是scipy.linalg.lstsq经过封装后的估计器。

参考:

 

导包

from sklearn.linear_model import LinearRegression
import sklearn.datasets as datasets

import numpy as np

数据集

iris = datasets.load_iris()
X = iris['data']
y = iris['target']

使用线性回归算法训练

# X_scale = []
'''LinearRegression(fit_intercept=True【中心化处理:数据的中心化是指数据集中的各项数据减去数据集的均值,
为了消除量纲对数据结构的影响】, normalize=False, copy_X=True, n_jobs=1)'''
lrg = LinearRegression(fit_intercept=False)
lrg.fit(X,y)
Out:
LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False)

【拓展】中心化和标准化-----------------------------------------------------------------------------

      在回归问题和一些机器学习算法中,以及训练神经网络的过程中,通常需要对原始数据进行中心化(Zero-centered或者Mean-subtraction)处理和标准化(Standardization或Normalization)处理。目的:通过中心化和标准化处理,得到均值为0,标准差为1的服从标准正态分布的数据。
计算过程由下式表示:

线性回归的评价标准差 线性回归 标准差_数据

下面解释一下为什么需要使用这些数据预处理步骤。

       在一些实际问题中,我们得到的样本数据都是多个维度的,即一个样本是用多个特征来表征的。比如在预测房价的问题中,影响房价 y 的因素有房子面积 x1、卧室数量 x2 等,我们得到的样本数据就是 (x1,x2) 这样一些样本点,这里的 x1、x2 又被称为特征。很显然,这些特征的量纲和数值得量级都是不一样的,在预测房价时,如果直接使用原始的数据值,那么他们对房价的影响程度将是不一样的,而通过标准化处理,可以使得不同的特征具有相同的尺度(Scale)。这样,在使用梯度下降法学习参数的时候,不同特征对参数的影响程度就一样了。简言之,当原始数据不同维度上的特征的尺度(单位)不一致时,需要标准化步骤对数据进行预处理。
      下图中以二维数据为例:左图表示的是原始数据;中间的是中心化后的数据,数据被移动大原点周围;右图将中心化后的数据除以标准差,得到为标准化的数据,可以看出每个维度上的尺度是一致的(红色线段的长度表示尺度)。

 

线性回归的评价标准差 线性回归 标准差_数据集_02

      其实,在不同的问题中,中心化和标准化有着不同的意义,比如在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛。另外,对于主成分分析(PCA)问题,也需要对数据进行中心化和标准化等预处理步骤。对数据进行中心化预处理,这样做的目的是要增加基向量的正交性。

      对数据标准化的目的是消除特征之间的差异性。便于对一心一意学习权重。

作者:北铭

---------------------------------------------------------------------------------------------------------------------

查看回归系数W

lrg.coef_
Out:
array([-0.08152463, -0.02718886,  0.22323945,  0.59971736])

#截距
lrg.intercept_
Out:0.0

手算W

# 求转置
T = X.T

# 求 (np.dot(X.T,X))^-1
NI = np.linalg.inv(np.dot(T,X))

# 求 np.dot((np.dot(X.T,X))^-1,X.T)
RE = np.dot(NI,T)

# 求 np.dot(np.dot((np.dot(X.T,X))^-1,X.T),y)
np.dot(RE,y)

Out:
array([-0.08152463, -0.02718886,  0.22323945,  0.59971736])