- 上一篇我们讨论了单变量的线性回归问题,题目背景是房子尺寸和价格的关系,但是实际中房价不仅只与房子的尺寸有关,还和房子的楼层,屋子数量,建造时间,所处位置等等有关,所以我们涉及到的是多变量的线性回归问题,下面主要来讨论这一种情况。
1.多变量的定义
- 假如现在的房价与四个变量有关,分别是尺寸、房屋数、楼层数、房屋年龄,这些都是特征变量,分别用x1,x2,x3,x4来表示他们,
n表示特征变量的个数,m表示样本数据的个数(以行计),下面这种上标为2是训练集的索引,表示为某一行的向量
x
(
2
)
=
[
1416
3
2
40
]
x^{(2)}=\begin{bmatrix}1416 \\ 3 \\ 2 \\ 40 \end{bmatrix}
x(2)=⎣⎢⎢⎡14163240⎦⎥⎥⎤
x
3
(
2
)
=
2
x^{(2)}_3=2
x3(2)=2
代
表
第
2
个
特
征
向
量
的
第
3
个
特
征
值
代表第2个特征向量的第3个特征值
代表第2个特征向量的第3个特征值
- 假设函数的修改
原 来 的 假 设 函 数 为 h θ ( x ) = θ 0 + θ 1 x , 这 是 单 一 变 量 , 我 们 要 改 为 多 变 量 原来的假设函数为h_\theta(x)=\theta_0+\theta_1x,这是单一变量,我们要改为多变量 原来的假设函数为hθ(x)=θ0+θ1x,这是单一变量,我们要改为多变量
修 改 之 后 的 假 设 函 数 为 h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 修改之后的假设函数为h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_4x_4 修改之后的假设函数为hθ(x)=θ0+θ1x1+θ2x2+θ3x3+θ4x4
接下来为了简化等式的表示方式,我们将x0=1,这时候我们的特征向量X就表示为:
X = [ x 0 x 1 x 2 . . . x n ] X=\begin{bmatrix}x_0 \\ x_1 \\ x_2 \\ ...\\x_n \end{bmatrix} X=⎣⎢⎢⎢⎢⎡x0x1x2...xn⎦⎥⎥⎥⎥⎤
同时可以把参数也看成一个参数向量,表示为:
θ = [ θ 0 θ 1 θ 2 . . . θ n ] \theta=\begin{bmatrix}\theta_0 \\ \theta_1 \\ \theta_2 \\ ...\\\theta_n \end{bmatrix} θ=⎣⎢⎢⎢⎢⎡θ0θ1θ2...θn⎦⎥⎥⎥⎥⎤
那么此时假设函数就可以写成两个向量之间的关系:
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n = [ θ 0 , θ 1 , . . . θ n ] ∗ [ x 0 x 1 x 2 . . . x n ] = θ T X h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n=[\theta_0,\theta_1,...\theta_n]*\begin{bmatrix}x_0 \\ x_1 \\ x_2 \\ ...\\x_n \end{bmatrix}=\theta^TX hθ(x)=θ0+θ1x1+θ2x2+...+θnxn=[θ0,θ1,...θn]∗⎣⎢⎢⎢⎢⎡x0x1x2...xn⎦⎥⎥⎥⎥⎤=θTX
即,先把参数向量θ向量转置,再与特征向量X相乘,就得到了假设函数。
2.多元梯度下降法
- 在之前我们讨论过单变量的代价函数以及梯度下降参数的更新表达式,那么对于多元的代价函数和梯度下降表达式也可以以此类推:
代 价 函 数 : J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 代价函数:J(\theta)={1\over 2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 代价函数:J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2 - 梯度下降更新表达式:
θ 0 = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x 0 ( i ) \theta_0=\theta_0-\alpha{1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x^{(i)}_0 θ0=θ0−αm1i=1∑m(hθ(xi)−yi)x0(i)
θ 1 = θ 1 − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x 1 ( i ) \theta_1=\theta_1-\alpha{1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x^{(i)}_1 θ1=θ1−αm1i=1∑m(hθ(xi)−yi)x1(i)
θ 2 = θ 2 − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x 2 ( i ) \theta_2=\theta_2-\alpha{1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x^{(i)}_2 θ2=θ2−αm1i=1∑m(hθ(xi)−yi)x2(i)
. . . ... ...
θ n = θ n − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x n ( i ) \theta_n=\theta_n-\alpha{1\over m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x^{(i)}_n θn=θn−αm1i=1∑m(hθ(xi)−yi)xn(i)
(其中 x 0 = 1 x_0=1 x0=1) - 这样我们得到的就是多元的梯度下降表达式,如果有多个变量的线性回归,我们也可以实现了。
3.多元梯度下降法——特征缩放
- 实际的多变量梯度下降中,每一个变量的取值范围不同,比如上面的房子价格例题中 x1=size 范围是(0-2000),x2=number of bedrooms 范围是(1-5),那么这样得出的θ1和θ2相差的范围也很大,最终画出的代价函数的图像就如下:
他的图像就比较细长,原因是θ1*x1,x1范围大,相对于乘的θ1就小,x2范围小,相对于乘的θ2就大,这就导致代价函数的图像为椭圆,故在梯度下降的时候需要经过很长时间才能到达最优解,中间的过程基本都是在来回徘徊,走的是折线,下降速度很慢。
- 为了解决这一问题,我们发现了问题的根源是因为特征值的取值范围相差过大导致的,那么我们就可以让这些特征值的范围在相同的范围内,这样梯度下降的就比较快。
x
1
=
s
i
z
e
2000
(
0
≤
x
1
≤
1
)
x_1={size\over2000}(0\le x_1\le1)
x1=2000size(0≤x1≤1)
x
2
=
n
u
m
b
e
r
−
o
f
−
r
o
o
m
s
5
(
0
≤
x
2
≤
1
)
x_2={number - of - rooms\over5}(0\le x_2\le1)
x2=5number−of−rooms(0≤x2≤1)
这样把x1,x2的范围都规定到[0,1],画出来的代价函数等位线图如下,就近似为一个圆,这样梯度下降的就比较快。
- 我们所希望的是让每个特征值都大约在-1<=xi<=1范围内,x0=1所以不需要处理,但是其实“1”这个值并不是绝对的,我们对数据进行放缩的目的是让数据的取值范围尽量保证在一个接近的范围内,但也不一定要相同,比如:x1:0-3、x2:-2-0.5等等也都是可以的,不会很大程度上影响J(θ)的收敛程度,但是如果有x3:-100-100、x4:-0.0001-0.0001,这个时候,范围相差太大,就会有影响了。
- 下面介绍一种特征缩放的方法————均值归一化(Mean normalization)
x = x − μ s x={x-\mu \over s} x=sx−μ
μ 即 每 个 特 征 值 的 平 均 值 \mu 即每个特征值的平均值 μ即每个特征值的平均值
s 为 特 征 值 的 最 大 值 减 去 最 小 值 s 为特征值的最大值减去最小值 s为特征值的最大值减去最小值
比 如 x 1 = x 1 − 1000 2000 ( − 0.5 ≤ x 1 ≤ 0.5 ) 比如x_1={x_1-1000\over2000}(-0.5\le x_1\le0.5) 比如x1=2000x1−1000(−0.5≤x1≤0.5)
x 2 = r o o m s − 2 4 ( − 0.5 ≤ x 2 ≤ 0.5 ) x_2={rooms-2\over4}(-0.5\le x_2\le0.5) x2=4rooms−2(−0.5≤x2≤0.5)
这样用均值归一化的方法可以有效的解决上述问题。
4.控制学习速率(Learning rate)
- 和前面所讨论a的取值一样,学习速率会影响到梯度下降的速度,但是我们刚开始不知道a到底应该取多少较为合适,所以我们可以画出代价函数的值与迭代次数的关系图像:
可以计算每一次代价函数的值,将他的图像画出来,通过这个图像来检验我们a的取值是否正确,上面是正常的图像,随着迭代次数的增加,J的值应该减小,直到最后趋近于0,最终收敛(迭代次数可能不是图上的几百次)。 - 如果出现了下图所示的图像,就表明你的a取值过大,导致下降的时候跨过了最低点,从而一次次跨过最低点,J的值越来越大,这时候要做的是减小a的取值。
- 如果出现了下面的图像,这也表明你的a取值过大,需要减小a的取值。
- 总之,我们取值a不对的话,图像就会出现异常,基本上都是a过大,理论上来说a足够小的话,他是肯定能够到达最低点,只是时间较长,故我们取值a的时候可以按下面的取值进行:
. . . , 0.001 , 0.003 , 0.01 , 0.03 , 0.1 , 0.3 , 1 , . . . ...,0.001,0.003,0.01,0.03,0.1,0.3,1,... ...,0.001,0.003,0.01,0.03,0.1,0.3,1,...
5.特征和多项式回归
- 对于房子的预测问题,假如price是与房子的宽度和深度有关,这样就有了两个变量frontage和depth,但是实际上不需要这两个变量,用一个size变量就可以描述,size = frontage*depth,这样就把两个变量转化为一个变量,问题就会变得简单,就变成了之前的问题。
- 在前面的介绍中,我们一直都是在用线性关系来描述y和x的关系,但是从下面的图中可以看出,用线性关系来描述显然是不够准确的。
- 从图像前面的走向似乎是一个二次函数,不妨我们设假设函数为
h ( x ) = θ 0 + θ 1 x + θ 2 x 2 h(x)=\theta_0+\theta_1x+\theta_2x^2 h(x)=θ0+θ1x+θ2x2
这样的话假设函数就不是线性函数了,就变成了一个多项式,如何解决这类问题呢,其实我们可以把多项式转化为线性的。
h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h(x)=\theta_0+\theta_1x_1+\theta_2x_2 h(x)=θ0+θ1x1+θ2x2
x 1 = s i z e , x 2 = s i z e 2 x_1=size,x_2=size^2 x1=size,x2=size2
这样用前面的梯度下降就可以很好得解决这个二次函数拟合的问题,但是二次函数是一个关于对称轴对称的图形,表明到了后面,会是下降的趋势,而根据实际情况可知,price是不会下降的,所以我们可以猜想
h ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 h(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3 h(x)=θ0+θ1x+θ2x2+θ3x3
这就是一个三次函数多项式了,同上面一样我们仍然可以转化为线性的。
h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 h(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3 h(x)=θ0+θ1x1+θ2x2+θ3x3
x 1 = s i z e , x 2 = s i z e 2 , x 3 = s i z e 3 x_1=size,x_2=size^2,x_3=size^3 x1=size,x2=size2,x3=size3
而根据图像和所学函数的图像,似乎我们还有另外一个更好的函数关系来描述两者的关系:
h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h(x)=\theta_0+\theta_1x_1+\theta_2x_2 h(x)=θ0+θ1x1+θ2x2
x 1 = s i z e , x 2 = s i z e x_1=size,x_2=\sqrt {size} x1=size,x2=size - 这里所讲的就是如何处理多项式回归的问题,本质上还是将其转化为线性回归的问题,因为有许多函数可以选择,所以到底选择哪一个函数也不确定,以后会讨论如何选择哪个多项式的问题。
6.正规方程Normal equation(区别于迭代方法的直接解法)
-
这时我们回到刚开始讨论梯度下降的时候,我们为什么要引入梯度下降,目的是为了求解代价函数J(θ)的最小值所满足的条件,那么用数学方法求一个函数的最小值,可以用一阶导数等于0的方法,求出对应的θ
J ( θ ) = a ∗ θ 2 + b ∗ θ + c , 为 了 找 到 J 最 小 的 θ J(\theta)=a*\theta^2+b*\theta+c,为了找到J最小的\theta J(θ)=a∗θ2+b∗θ+c,为了找到J最小的θ
我 们 对 J 求 一 阶 倒 数 时 期 等 于 0 , 即 : d J ( θ ) d θ = 0 时 的 θ 的 值 我们对J求一阶倒数时期等于0,即:{dJ(\theta)\over d\theta}=0时的\theta 的值 我们对J求一阶倒数时期等于0,即:dθdJ(θ)=0时的θ的值
-
对于多变量的J(θ),我们也可以用上述方法来求得θ向量:
∂ J ( θ ) ∂ θ j = 0 ( f o r − e v e r y − j ) {\partial J(\theta)\over \partial \theta_j}=0(for - every -j) ∂θj∂J(θ)=0(for−every−j) -
实际上我们不用这种方法,这种方法需要求很多导数,下面介绍一种正规方程的解法,假如房子的price与以下几个变量有关:
这里用到了前面讲的特征矩阵X,和特征向量y,特征矩阵把x0=1也加进去了方便求解,x是一个m*(n+1)的矩阵,y是一个m维向量。那么θ就有如下的表达:
θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy
至于关于这个式子的数学推导,大家可以只做了解,不需要深入地探究。下面是推导过程:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
⇒
J
(
θ
)
=
1
2
m
∥
(
h
(
x
(
i
)
)
−
y
(
i
)
)
∥
2
J(\theta)={1\over 2m}\sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2\Rightarrow J(\theta)={1\over 2m}\begin{Vmatrix} (h(x^{(i)})-y^{(i)})\\ \end{Vmatrix}^2
J(θ)=2m1i=1∑m(h(x(i))−y(i))2⇒J(θ)=2m1∥∥(h(x(i))−y(i))∥∥2
=
1
2
m
(
X
θ
−
y
)
T
(
X
θ
−
y
)
={1\over 2m}(X\theta-y)^T(X\theta-y)
=2m1(Xθ−y)T(Xθ−y)
再对J(θ)关于θ求导并令其为0,即可求出对应的θ,值得注意的是X^TX必须是可逆矩阵,即每个特征都是相互独立的,没有多余的特征.
正规方程和梯度下降的对比
讨论了两种方法,那么大家肯定对于选择哪一种方法产生疑惑,下面讨论两种方法的优缺点:
- 梯度下降:
优点:特征值比较多时也可以很好的求解问题
缺点:a(学习速率)不好调控,还需要画出J与迭代次数的图像从而检查梯度下降,这个比较麻烦。还有就是迭代次数较多,有时花费的时间较长。并且有时需要用到特征缩放来加快下降。 - 正规方程
优点:不需要迭代,直接解一个矩阵变换即可,实现较容易,不用控制学习速率和特征缩放。
缺点:因为计算机计算逆矩阵时也要花费时间,当特征值比较多的时候,矩阵的维度也会增多,所以逆矩阵计算也相当费时间。
我们大致有一个评判标准,当n=10000多时,我们就选择梯度下降而当n小于这个值时,我们就果断地选择正规方程。
7.正规方程在矩阵不可逆下的解决方法
-
根据我们所学的线性代数的知识,我们知道一个矩阵是否可逆是有判断条件的,其充要条件为:
∣ A ∣ / = 0 且 A − 1 = A ∗ ∣ A ∣ |A| /= 0且A^{-1}={A^*\over|A|} ∣A∣/=0且A−1=∣A∣A∗
其 中 A ∗ 是 A 的 伴 随 矩 阵 其中A^*是A的伴随矩阵 其中A∗是A的伴随矩阵
那么,我们在构建特征矩阵X的时候,有以下两个因素会导致矩阵不可逆 -
特征值之间有线性的关系,比如x1=feet2,x2=m2,平方米和英寸之间有一个系数关系,他们之间有线性关系,那么学过线性代数的都知道,若有两列成比例,那么他的行列式等于0,即上述式子分母为0,这一种情况是矩阵不可逆的。
解决办法:消除特征值之间的线性关系
- 数据集m个数很少,而特征值n的数量很多,导致要从很少的数据中拟合多个参数,这样的话会导致矩阵不可逆
解决办法:尽量减少特征值的个数,如果实在减少不了,后面会讲到用正则化来处理较少少数据集求多个参数的情况。