第2、5章 线性回归
概述
线性回归问题,是用来解决回归问题的最简单的算法。
线性回归(Linear Regression)是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。
如果特征只有一个,则称之为“一元线性分析”;如果特征有多个,则称之为“多元线性分析”。
基本原理
一元线性函数可以表达为:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_θ(x)=θ_0 + θ_1x
hθ(x)=θ0+θ1x,多元线性函数可以表达为
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
.
+
θ
i
x
i
h_θ(x)=θ_0+θ_1x_1+θ_2x_2+....+θ_ix_i
hθ(x)=θ0+θ1x1+θ2x2+....+θixi,我们把这个函数作为线性回归的“评估函数”。
其中
θ
θ
θ称之为“参数”,我们的目的就是找到最合适的
θ
θ
θ,使真实值和预测值之间的差异足够小。
一般采用梯度下降、最小二乘法去计算该参数。
代价函数
代价函数就是为了获得最合适的 θ 0 θ_0 θ0 θ 1 θ_1 θ1而使用的函数。
平方误差函数
平方误差函数是最常用的代价函数,尤其在回归场景下的效果非常好: J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 J(θ_0,θ_1)=\frac{1}{2m}\sum_{i=1}^{m}{(h(x_i)-y_i)}^2 J(θ0,θ1)=2m1i=1∑m(h(xi)−yi)2
最合适的 θ 0 θ_0 θ0 θ 1 θ_1 θ1,就是使代价函数 J ( θ 0 , θ 1 ) J(θ_0,θ_1) J(θ0,θ1)值最小的参数。
分析一下这个函数:
- h ( x i ) h(x_i) h(xi):代表的是第i个预测结果。
- y i y_i yi:代表的是第i个真实结果。
- ( h ( x i ) − y i ) 2 {(h(x_i)-y_i)}^2 (h(xi)−yi)2:代表的是真实值与预测值的差的平方,之所以求平方是不是为了获得正数??
- 1 2 m \frac{1}{2m} 2m1:m代表的是训练样本的数量,除以m可以理解,求平均值,除2m就不知道是为啥了??
梯度下降
如何求得代价函数的最小值呢?
梯度下降是求解函数最小值的常用方法。梯度下降的步骤是:
- 设置 θ 0 θ 1 θ_0 θ_1 θ0θ1为某个值,比如0;
- 同时改变 θ 0 θ 1 θ_0 θ_1 θ0θ1的值,使 J ( θ 0 , θ 1 ) J(θ_0, θ_1) J(θ0,θ1)越好越小,直到接近局部最优。
- 此时的 θ 0 θ 1 θ_0 θ_1 θ0θ1就是最优解。
用一个形象的方式来描述梯度下降算法,如下图所示:
- 这是一座小山,目的是从山顶快速下山。
- 假设从点1开始下山,向周围看看哪个方向是下山最快的方向,然后往前走一步,比如到了1.1.
- 以1.1为始重复上述的步骤,一步步往山下走,最终走到了山脚。
- 而如果从点2开始下山的话,也会一步步走下山来,只不过终点可能是不一样的。
- 这正是梯度下降算法的一个特点:不同的起始点,可能到达不同的局部最优点。
梯度下降公式
下面给出梯度下降的公式:
推导过程就算了,没这个本事,下面看看该公式各个部分的含义:
- 目的:梯度下降的目的是求出最优点的 θ 0 θ 1 θ_0 θ_1 θ0θ1的取值。
- 最外层的repeat代表这个公式需要不断递归,直到达到最优点为止。
- for j=0 and j=1的意思是:因为只有两个 θ \theta θ,分别是 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1。
- := 这个符号是赋值的意思,即迭代更新 θ j θ_j θj的值。这个在java中是很常见的用法,例如 i = i + 1 i = i + 1 i=i+1。
-
α
α
α :学习速率,代表着梯度下降的步长,α越大,则下降的越快,否则下降的越慢。
- 太大:造成无法收敛,过于发散的问题。
- 太小:迭代过程及其缓慢。
- σ σ θ j J ( θ 0 , θ 1 ) \frac{\sigma}{\sigma θ_j}{J(θ_0,θ_1)} σθjσJ(θ0,θ1):是导数,后面再详细描述导数的含义。
梯度下降的计算方式,称为同步更新方式,即使用同样的样本、参数来计算
θ
0
θ
1
θ_0 θ_1
θ0θ1的值。计算过程是这样的:
在计算
θ
1
θ_1
θ1的时候,
θ
0
θ_0
θ0依然是之前的
θ
0
θ_0
θ0。
导数的作用
吴恩达老师介绍的导数概念,非常简单易懂:导数就是斜率。为了容易理解,假设
θ
0
=
0
θ_0=0
θ0=0,我们看看
θ
1
θ_1
θ1的变化情况:
如上图所示,沿着曲线画一条切线出来,该切线随着横轴变大的趋势,所以斜率是正值(
斜
率
角
=
垂
直
距
离
水
平
距
离
斜率角=\frac{垂直距离}{水平距离}
斜率角=水平距离垂直距离,如上图所示该斜率角为锐角,则斜率为正),则
θ
1
=
θ
1
−
α
∗
正
数
θ_1=θ_1 - α *正数
θ1=θ1−α∗正数,则
θ
1
θ_1
θ1变小,往函数的底部移动;
而如果起始点在局部最优点的左边,切线不断变小,斜率为负数,则
θ
1
=
θ
1
−
α
∗
负
数
θ_1=θ_1 - α *负数
θ1=θ1−α∗负数,则
θ
1
θ_1
θ1变大,往函数的底部移动;
斜率可以参考:斜率的计算公式
这两种情况下,都能保证 θ 1 θ_1 θ1向着局部最优点移动。当到达局部最优点时,斜率为0,则 θ 1 θ_1 θ1就不会再发生变化了。
通过梯度下降求解平方误差函数
把平方误差函数的公式带入梯度下降算法中,梯度下降算法变成如下所示的公式:
repeat{
θ
0
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
θ_0=θ_0-α\frac{1}{m}\sum_{i=1}^m(h_θ(x_i)-y_i)
θ0=θ0−αm1∑i=1m(hθ(xi)−yi)
θ
1
=
θ
1
−
α
1
m
∑
i
=
1
m
(
(
h
θ
(
x
i
−
y
i
)
∗
x
i
θ_1=θ_1-α\frac{1}{m}\sum_{i=1}^m((h_θ(x_i-y_i)*x_i
θ1=θ1−αm1∑i=1m((hθ(xi−yi)∗xi
}
这个公式,恕我推导不出来。
多变量线性回归
多变量线性回归,指的是样本特征的数量大于1个的情况,现实世界中这种情况更通用。
符号表
- x 1 , x 2 , . . . . . . x n x_1, x_2, ......x_n x1,x2,......xn:表示特征。
- y:预测结果。
- m:样本数量。
- n:特征数量
- x ( i ) x^{(i)} x(i):代表第i个样本的特征,是一个向量。
- x j ( i ) x_j^{(i)} xj(i):代表第i个样本的第j个特征。
评估函数
多变量线性回归的评估函数是
h
θ
(
x
)
=
θ
0
+
θ
1
∗
x
1
+
θ
2
∗
x
2
+
θ
3
∗
x
3
+
.
.
.
.
.
.
+
θ
n
∗
x
n
h_θ(x)=θ_0+θ_1*x_1+θ_2*x_2+θ_3*x_3+......+θ_n*x_n
hθ(x)=θ0+θ1∗x1+θ2∗x2+θ3∗x3+......+θn∗xn
为了表达方便,我们假设
x
0
=
1
x_0=1
x0=1,则评估函数就变成了
h
θ
(
x
)
=
θ
0
∗
x
0
+
θ
1
∗
x
1
+
θ
2
∗
x
2
+
θ
3
∗
x
3
+
.
.
.
.
.
.
+
θ
n
∗
x
n
h_θ(x)=θ_0*x_0+θ_1*x_1+θ_2*x_2+θ_3*x_3+......+θ_n*x_n
hθ(x)=θ0∗x0+θ1∗x1+θ2∗x2+θ3∗x3+......+θn∗xn。
下面对评估函数做一下简化处理,
- 假 设 θ = [ θ 0 θ 1 θ 2 . . . θ n ] θ=\left[\begin{matrix}θ_0\\θ_1\\θ_2\\...\\θ_n\end{matrix}\right] θ=⎣⎢⎢⎢⎢⎡θ0θ1θ2...θn⎦⎥⎥⎥⎥⎤
- 假设 X = [ x 0 x 1 x 2 . . . x n ] X=\left[\begin{matrix}x_0\\x_1\\x_2\\...\\x_n\end{matrix}\right] X=⎣⎢⎢⎢⎢⎡x0x1x2...xn⎦⎥⎥⎥⎥⎤
- 则 θ T = [ θ 0 θ 1 θ 2 . . . θ n ] θ^T=\left[\begin{matrix}θ_0&θ_1&θ_2&...&θ_n\end{matrix}\right] θT=[θ0θ1θ2...θn]
- 则 θ T ∗ X = h θ ( x ) θ^T * X=h_θ(x) θT∗X=hθ(x),所以评估函数最终简化为 h θ ( x ) = θ T ∗ X h_θ(x)=θ^T*X hθ(x)=θT∗X。
矩阵相乘的算法可以参考:机器学习之线性代数知识普及
梯度下降
多变量下梯度下降算法的公式变为如下所示:
repeat{
θ
0
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
θ_0=θ_0-α\frac{1}{m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})
θ0=θ0−αm1∑i=1m(hθ(x(i))−y(i))
θ
j
=
θ
j
−
α
1
m
∑
i
=
1
m
(
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∗
x
j
(
i
)
θ_j=θ_j-α\frac{1}{m}\sum_{i=1}^m((h_θ(x^{(i)})-y^{(i)})*x^{(i)}_j
θj=θj−αm1∑i=1m((hθ(x(i))−y(i))∗xj(i)
}
我们还是假设
x
0
=
1
x_0=1
x0=1,则
x
0
i
=
1
x_0^i = 1
x0i=1
所以梯度下降算法就可以简化为:
repeat{
θ
j
=
θ
j
−
α
1
m
∑
i
=
1
m
(
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∗
x
j
(
i
)
θ_j=θ_j-α\frac{1}{m}\sum_{i=1}^m((h_θ(x^{(i)})-y^{(i)})*x^{(i)}_j
θj=θj−αm1∑i=1m((hθ(x(i))−y(i))∗xj(i)
}
特征收敛
如果特征1的取值范围是(0-1),特征2的取值范围是(0-1000),这样的特征在梯度下降算法中计算起来非常慢且有可能无法收敛,解决方法就是把各个特征进行收敛,使它们的取值范围接近。
发散的特征指的是特征值间的差距过大,比如1和1000差1000倍,0.001和1其实也差1000倍。
除以最大值
比如可以把特征2的每个值都除以1000,这样就能得到(0-1)的数字了。但是这种方法有可能造成特征值太小,同样不能满足要求。
均值归一
x
=
x
−
平
局
值
最
大
值
−
最
小
值
=
x
−
μ
S
x = \frac{x-平局值}{最大值-最小值}=\frac{x-\mu}{S}
x=最大值−最小值x−平局值=Sx−μ
其中
μ
\mu
μ指的就是平均值;S指的是“
最
大
值
−
最
小
值
最大值-最小值
最大值−最小值”
特征增减
有时候根据已有特征生成新特征,可以取得不俗的效果。
有时间把重复的特征去掉,反而能得到更好的效果。
α选值
α没有一个标准的值,太小的话计算效率慢;太大的话可能造成无法收敛,所以要不断地去优化这个参数,吴老师给出了一个经验值(0.001 0.003 0.01 0.03 0.1)。当收敛效果一致的情况下,选择稍大一些的α值,提升计算效率。
正规方程
利用正规方程可以一步求解,而不需要一步步迭代,正规方程的表达式为:
θ
=
(
X
T
∗
X
)
−
1
X
T
Y
θ=(X^T*X)^{-1}X^TY
θ=(XT∗X)−1XTY。
下面对梯度下降和正规方程进行对比,看看两者的优缺点各是什么。
梯度下降 | 正规方程 | |
---|---|---|
α | 需要计算合适的α值 | 不需要 |
计算速度 | 多次迭代,速度慢 | 直达目标,速度快 |
特征数量 | 无限制 | 小于10000 |
适用场景
示例
import pandas as pd
from sklearn.linear_model import LinearRegression
# 特征字段
features = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'price', 'minimum_nights', 'maximum_nights',
'number_of_reviews']
# normalize:特征是否做标准化处理,train_data['price']:是预测结果
reg = LinearRegression(normalize=True).fit(train_data[features], train_data['price'])
print("score", reg.score(test_data[columns], test_data['price']))
名词解释
高斯分布
高斯分布,也称之为正态分布。满足集中性、对称性、均匀变动性等特点。
- 集中性:正态曲线的高峰位于正中央,即均数所在的位置。
- 对称性:正态曲线以均数为中心,左右对称,曲线两端永远不与横轴相交。
- 均匀变动性:正态曲线由均数所在处开始,分别向左右两侧逐渐均匀下降。