1.基本问题

线性回归属于有监督的算法,用来做回归预测。在实际的有监督回归问题中,我们通过拟合系数 

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归

的线性模型,以最小化数据集中观察到的响应y与线性近似预测的响应之间

PTHON 带约束的回归 有约束的线性回归_梯度下降_02

的残差平方和。我们的目标便是选择出可以使得残差平方和最小的模型参数PTHON 带约束的回归 有约束的线性回归_代价函数_03,即得到代价函数PTHON 带约束的回归 有约束的线性回归_代价函数_04

表达方式:

(1)单变量线性回归(因为只含有一个特征/输入变量)

PTHON 带约束的回归 有约束的线性回归_梯度下降_05

PTHON 带约束的回归 有约束的线性回归_代价函数_06

其中,

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_07

是此线性模型的参数,

是输入变量,

是样本个数,

是真实值。

(2)多变量线性回归(含有n个特征/输入变量)

PTHON 带约束的回归 有约束的线性回归_梯度下降_08

这个公式中有

个参数和

个变量,为了使公式能够简化一些,引入一个变量

PTHON 带约束的回归 有约束的线性回归_线性回归_09

,则公式转化为:

PTHON 带约束的回归 有约束的线性回归_线性回归_10

PTHON 带约束的回归 有约束的线性回归_梯度下降_11

此时模型中的参数是一个

维的向量,将公式简化如下:

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_12

其中,

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_13

 ,

PTHON 带约束的回归 有约束的线性回归_线性回归_14

2.公式推导(求解代价函数

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_15

(1)梯度下降

梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到得到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。

批量梯度下降(batch gradient descent)算法的公式为:

PTHON 带约束的回归 有约束的线性回归_线性回归_16

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_17

PTHON 带约束的回归 有约束的线性回归_代价函数_18

其中PTHON 带约束的回归 有约束的线性回归_线性回归_19是学习率,它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。

梯度下降中,我们要更新

PTHON 带约束的回归 有约束的线性回归_代价函数_20

求导过程(单变量):

PTHON 带约束的回归 有约束的线性回归_代价函数_21

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_22

PTHON 带约束的回归 有约束的线性回归_代价函数_23

算法为:

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_24

PTHON 带约束的回归 有约束的线性回归_线性回归_25

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_26

求导过程(多变量):

”批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有m个训练样本求和。

由上面的单变量求导过程我们可以得到多变量的求导结果:

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_27

PTHON 带约束的回归 有约束的线性回归_线性回归_28

同时,我们也可以类似于简化多变量模型

PTHON 带约束的回归 有约束的线性回归_线性回归_29

一样来对此公式向量化。

PTHON 带约束的回归 有约束的线性回归_线性回归_30

其中,

PTHON 带约束的回归 有约束的线性回归_线性回归_31


PTHON 带约束的回归 有约束的线性回归_线性回归_32


PTHON 带约束的回归 有约束的线性回归_梯度下降_33

(2)正规方程:

对于某些线性回归问题,正规方程方法是更好的解决方案,个人觉得在写代码的时候用着也方便。正规方程是通过求解方程:

PTHON 带约束的回归 有约束的线性回归_代价函数_34

来找出使得代价函数最小的参数的。解得 :   

PTHON 带约束的回归 有约束的线性回归_代价函数_35

正规方程求解过程(以多变量为例):

PTHON 带约束的回归 有约束的线性回归_代价函数_36


PTHON 带约束的回归 有约束的线性回归_线性回归_37

带入得到(即向量表达式转化为矩阵表达式):

 

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_38

其中PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_39


列的矩阵(

为样本个数,

为特征个数),


行1列的矩阵,PTHON 带约束的回归 有约束的线性回归_代价函数_40

行1列的矩阵,对J进行如下变换

PTHON 带约束的回归 有约束的线性回归_线性回归_41

PTHON 带约束的回归 有约束的线性回归_梯度下降_42


PTHON 带约束的回归 有约束的线性回归_线性回归_43

θ求偏导,其中用到两个公式

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_44


PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_45

,因此:

PTHON 带约束的回归 有约束的线性回归_线性回归_46


PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_47

  令

PTHON 带约束的回归 有约束的线性回归_代价函数_48

可得:


 

PTHON 带约束的回归 有约束的线性回归_PTHON 带约束的回归_49

3.代码部分:

在sklearn中可以直接调用,下面是一个简单的例子。

from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

diabetes = datasets.load_diabetes()

diabetes_X = diabetes.data
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
regr = LinearRegression()    # Create linear regression object
regr.fit(diabetes_X_train, diabetes_y_train)    # Train the model using the training sets
diabetes_y_pred = regr.predict(diabetes_X_test)  # Make predictions using the testing set
print('Coefficients: \n', regr.coef_)   # The coefficients

# The mean squared error
print("Mean squared error: %.2f"  % mean_squared_error(diabetes_y_test, diabetes_y_pred)) 
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))

4.参考

(1)http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py

(2)Coursera-ML-AndrewNg-Notes-master