在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。


线性回归的意义:

线性回归作为监督性学习,即在给定多组输入和输出(training set)的情况下,通过建立假设h(hypothesis),学习训练集中输入特征与输出的关系,对未知输出结果的输入做出预测。

监督学习(supervised learning)通常有下列步骤:

回归里面的constrant 对X约束 回归分析constant_线性回归

举个例子,x可以是住房的面积,y是房子的价格。当你给h输入任意一个面积值,他就可以预测出这个房子价值多少钱。
当输出Y的值是连续性的时候,这个问题叫做regression。
当输出Y的值是离散性的时候,这个问题叫做classification。

人工生成training set:

import numpy as np
input = np.random.randint(500,2500,20)
output = - input**2 + input*3000
output += np.random.randint(-500000,500000,20)#添加扰动
input: 
 array([1838, 895, 889, 2117, 1606, 1577, 1445, 852, 1544, 2042, 1396, 
 1381, 2166, 560, 1912, 1835, 1842, 1386, 1133, 661])output: 
 array([1057981, 1737435, 1478503, 1760282, 1481681, 2475224, 2474398, 
 1888622, 1822441, 1879343, 2678768, 1892778, 2037657, 2016359, 
 1692353, 2205109, 2066814, 1860923, 1716627, 1546378]

假设有如上数据,x轴是房子面积,y轴是房子价格。

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_02

如果是上面的例子,x 是一维的(房子面积),那么H可以写成:

hθ(x) = θ0 + θ1x1 =

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_03

i = 1n ixi) + θ0为了简化我们的假设的表达:我们另x0 = 1(恒等)

此时我们的累加和表达式就变成了:

hθ(x) =

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_03

i = 0n ixi) = θTx

hθ(x)是预测的值,y是真实的值,我们的任务就是要找到一组Ө( θ0 , θ1),使hθ(x)尽可能得靠近y。
那么怎样的一组Ө( θ0 , θ1)可以被认为是能使hθ(x)尽可能得满足y呢?

这里我们定义一个误差函数(cost function),最小二乘来进行衡量:

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_05


这里的m表示training set 的大小。前面乘上的1/2是为了在求导的时候,这个系数就不见了。

我们的目标就是计算出一组Ө,使J最小。

线性回归模型经常用最小二乘逼近来拟合,但他们也可能用别的方法来拟合,比如用最小化“拟合缺陷”在一些其他规范里(比如最小绝对误差回归),或者在桥回归中最小化最小二乘损失函数的惩罚.相反,最小二乘逼近可以用来拟合那些非线性的模型.因此,尽管“最小二乘法”和“线性模型”是紧密相连的,但他们是不能划等号的。

线性回归的计算过程

假设我们用Least means square的方法,实际上就是求一条直线,它可以让每个点数据到直线距离的平方的和最小。

梯度下降法(Gradient Descent)

梯度下降法是按下面的流程进行的:

1、首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。
2、改变θ的值,使得J(θ)按梯度下降的方向进行减少。

数学表达式:

回归里面的constrant 对X约束 回归分析constant_拟合_06

注意:这里的每个θ都是同步更新的,a被称作学习率。

当我们只有一个training example 时,我们对J(θ)进行偏导,进而得到Ө的更新法则:

回归里面的constrant 对X约束 回归分析constant_迭代_07

(1)当我们有一个training set 时,我们对J(θ)进行偏导,进而得到Ө的更新法则:

回归里面的constrant 对X约束 回归分析constant_迭代_08

(2)

梯度下降就是不断得重复对Ө的更新,直到完成制定的迭代次数或者cost function的函数值小于某个指定的一个误差值。

当然,可能梯度下降的最终点并非是全局最小点,可能是一个局部最小点,可能是下面的情况:

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_09

但在我们人工样本中,这里的局部最小值等于全局最小值。

回归里面的constrant 对X约束 回归分析constant_迭代_10

#3维曲面的绘制,数据瞎填的不要在意
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
Z = 2*(X**2+Y**2)+3
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap='rainbow')
plt.show()

使用(2)式更新Ө时,我们每次都需要计算全部的样本数据,我们把这种方法称之为批量梯度下降(batch gradient desent)
代码:

得到:Ө[ 2.50574483 1179.20620832]

回归里面的constrant 对X约束 回归分析constant_拟合_11


J(θ)的变化曲线

回归里面的constrant 对X约束 回归分析constant_拟合_12


最后得到的线性拟合函数曲线

回归里面的constrant 对X约束 回归分析constant_线性回归_13


这里不得不说在把α置为0.1的时候,程序一直无法得到输出结果,在输出每次更新Ө的中间结果时发现,Ө并没有收敛,而是发散的形式。

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_14


在把a变更为1e-8时,Ө能够收敛。

当α过于小时,J(θ)会下降的非常缓慢,因此需要迭代更多次数才能达到效果,浪费计算资源。所以要选择合适的α值,太大太小都不合适。一般在训练样本时,多次尝试不同的α值,对比结果(可以绘制出J(θ)迭代的图形)后进行选择。Andrew Ng老师在课程中也给出了α尝试的方法:先选择一个较小的α值,收敛太慢的话以3倍来增加α值。

使用(1)式更新Ө时,我们每次只需要计算一个样本数据,我们把这种方法称之为随机梯度下降(Stochastic Gradient Descent)
前面的方法,需要处理完所有的训练数据之后才会每次更新一次Ө,如果训练数据很多的话,就会变得很慢。Stochastic Gradient Descent每处理完一个训练数据,就会立即更新Ө。在某种程度上,这可以提高程序的效率。
代码:

得到:Ө[ 1.96229264 1178.06704624]

回归里面的constrant 对X约束 回归分析constant_迭代_15


J(θ)的变化曲线(每次遍历样本得到的cost的均值变化)

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_16


J(θ)的变化曲线(可以看到虽然每次变化都是在波动的,但总体趋势是趋稳的)

回归里面的constrant 对X约束 回归分析constant_线性回归_17


最后得到的线性拟合函数曲线。

Normal Equation

因为gradient descent方法需要迭代很多次是的J(θ)达到最小值求得θ,自然而然的会有一种疑问:能不能不迭代,一次求得所需的θ呢?答案是肯定的。
这种方法不需要经过任何循环,也不需要假设初始值。虽然推导本身有点复杂,但是结果一步到位,简单又效率。

这个方法的基本思想就是:当J(θ)对所有θj的偏导等于0时,J(θ)取最小值(高等数学中有当导数等于0时函数达到极值)。

已知关于矩阵微分的式子:

回归里面的constrant 对X约束 回归分析constant_线性回归_18

矩阵迹的性质:

回归里面的constrant 对X约束 回归分析constant_机器学习_19


回归里面的constrant 对X约束 回归分析constant_线性回归_20

矩阵微分有如下特性:

回归里面的constrant 对X约束 回归分析constant_机器学习_21

已知:

我们有input:

回归里面的constrant 对X约束 回归分析constant_线性回归_22


output:

回归里面的constrant 对X约束 回归分析constant_线性回归_23

首先计算:

回归里面的constrant 对X约束 回归分析constant_迭代_24

这时,我们需要重新整理J(θ)

回归里面的constrant 对X约束 回归分析constant_迭代_25

联系矩阵微分的特性(2)和(3):

回归里面的constrant 对X约束 回归分析constant_机器学习_26

因此,我们可以得到:

回归里面的constrant 对X约束 回归分析constant_拟合_27

令矩阵微分等于0,可得:

回归里面的constrant 对X约束 回归分析constant_线性回归_28


得到:Ө

[[ 1.79865810e+06]

[ 6.17847120e+01]]

回归里面的constrant 对X约束 回归分析constant_回归里面的constrant 对X约束_29


最后得到的线性拟合函数曲线(话说这条直线有点怪)。

此时的J(θ) = 2.71829415945e+12

二者的优缺点:

(1)gradient descent需要选择一个合适的学习率α,前面讲到过,要寻找一个合适的α的过程时比较繁琐的(绘制J(θ)的收敛趋势图进行对比);
(2)gradient descent需要迭代很多次,而normal equation只需一次计算;
(3)当n(特征数)非常大时,gradient descent没有问题,但是normal equation的效率会非常低。解释一下:normal equation方法使用的是矩阵计算,上面公式中的(XTX)-1是计算一个(n*n)矩阵的逆,时间复杂度是O(n3),所以当n非常大时,效率会非常低。Andrew ng老师说到,当n多大时使用gradient descent多大时使用normal equation,没有一个明确的分界线。当n较小时一般使用normal equation比较快捷方便,一般当n达到1000,000时,应该开始考虑gradient descent;
(4)gradient descent需要进行Feature scaling处理(当进行多变量拟合时考虑),而normal equation不用。