在机器学习学习笔记(二)中,我们探讨了单变量/特征的回归模型,现在再对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为 ( x 0 , x 1 , . . . , x n ) (x_0,x_1,...,x_n) (x0,x1,...,xn) 。
增添更多特征后,再引入一系列新的注释:
n n n 代表特征的数量
x ( i ) x^{(i)} x(i) 代表第 i i i 个训练实例,是特征矩阵中的第 i i i 行,是一个向量(vector)。
比方说,上图的, x ( 2 ) = [ 1416 3 2 40 ] x^{(2)}=\left[\begin{matrix} 1416 \\ 3 \\ 2 \\ 40 \end{matrix}\right] x(2)=⎣⎢⎢⎡14163240⎦⎥⎥⎤
x j ( i ) x_j^{(i)} xj(i) 代表特征矩阵中第 i i i 行的第 j j j 个特征,也就是第 i i i 个训练实例的第 j j j 个特征。
如上图的 x 2 ( 2 ) = 3 , x 3 ( 2 ) = 2 x_2^{(2)}=3,x_3^{(2)}=2 x2(2)=3,x3(2)=2 ,
支持多变量的假设 h h h 表示为: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n hθ(x)=θ0+θ1x1+θ2x2+...+θnxn ,
这个公式中有 n + 1 n+1 n+1 个参数和 n n n 个变量,为了使得公式能够简化一些,引入 x 0 = 1 x_0=1 x0=1 ,则公式转化为:
h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n hθ(x)=θ0x0+θ1x1+θ2x2+...+θnxn
此时模型中的参数是一个 n + 1 n+1 n+1 维的向量,任何一个训练实例也都是 n + 1 n+1 n+1 维的向量,特征矩阵X的维度是 m ∗ ( n + 1 ) m*(n+1) m∗(n+1) 。 因此公式可以简化为: h θ ( x ) = θ T X h_\theta(x)=\theta^TX hθ(x)=θTX ,其中上标 T T T 代表矩阵转置。
与单变量线性回归类似,在多变量线性回归中,也可以构建一个代价函数,则这个代价函数是所有建模误差的平方和,即:
J ( θ 0 , θ 1 . . . θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1...\theta_n)={1 \over 2m} \sum_{i=1}^{m} {(h_\theta(x^{(i)})-y^{(i)})^2} J(θ0,θ1...θn)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:
h θ ( x ) = θ T X = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta^TX=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n hθ(x)=θTX=θ0+θ1x1+θ2x2+...+θnxn
我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。 多变量线性回归的批量梯度下降算法为:
即:
求导数后得到:
当 n > = 1 n>=1 n>=1 时,
θ 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)})\cdot x^{(i)}_0)} θ0:=θ0−αm1i=1∑m((hθ(x(i))−y(i))⋅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)})\cdot x^{(i)}_1)} θ1:=θ1−αm1i=1∑m((hθ(x(i))−y(i))⋅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)})\cdot x^{(i)}_2)} θ2:=θ2−αm1i=1∑m((hθ(x(i))−y(i))⋅x2(i))
我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
计算代价函数
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = {1\over2m}\sum_{i=1}^{m} {(h_\theta(x^{(i)})-y^{(i)})^2} J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中:
h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta^TX=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
有幸在网上找到了Python代码,代码如下:
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))
在面对多维特征问题的时候,需要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。
解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间。 如图:
最简单的方法是令: x n = x n − μ n s n x_n={x_n-\mu_n \over s_n} xn=snxn−μn ,其中 μ n \mu_n μn 是平均值, s n s_n sn 是标准差。
梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
也有一些自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如0.001)进行比较,但通常看上面这样的图表更好。
梯度下降算法的每次迭代受到学习率的影响,如果学习率 α \alpha α 过小,则达到收敛所需的迭代次数会非常高;如果学习率 α \alpha α 过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。
通常可以考虑尝试这些学习率:
α = 0.01 , 0.03 , 0.1 , 0.3 , 1 , 3 , 10 \alpha=0.01,0.03,0.1,0.3,1,3,10 α=0.01,0.03,0.1,0.3,1,3,10
如房价预测问题,
h θ ( x ) = θ 0 + θ 1 × f r o n t a g e + θ 2 × d e p t h h_\theta(x)=\theta_0+\theta_1 \times frontage + \theta_2 \times depth hθ(x)=θ0+θ1×frontage+θ2×depth
x 1 = f r o n t a g e x_1=frontage x1=frontage (临街宽度), x 2 = d e p t h x_2=depth x2=depth (纵向深度), x = f r o n t a g e ∗ d e p t h x=frontage * depth x=frontage∗depth (面积),则: h θ ( x ) = θ 0 + θ 1 x h_\theta(x)=\theta_0+\theta_1x hθ(x)=θ0+θ1x 。 线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型: h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 2 h_\theta(x)=\theta_0+\theta_1x+\theta_2x_2^2 hθ(x)=θ0+θ1x+θ2x22 或者三次方模型: h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 2 + θ 3 x 3 3 h_\theta(x)=\theta_0+\theta_1x+\theta_2x_2^2+\theta_3x_3^3 hθ(x)=θ0+θ1x+θ2x22+θ3x33
显然对于房价而言,三次方模型会比二次方模型拟合得更好,因为二次方模型的价格最终会随着面积的增大而下降,这不符合我们的现实生活。
通常我们需要先观察数据然后再决定准备尝试怎样的模型。 另外,我们可以令: x 2 = x 2 2 , x 3 = x 3 3 x_2=x_2^2,x_3=x_3^3 x2=x22,x3=x33 ,从而将模型转化为线性回归模型。
根据函数图形特性,我们还可以使:
h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 1 ( s i z e ) 2 h_\theta(x)=\theta_0+\theta_1(size)+\theta_1(size)^2 hθ(x)=θ0+θ1(size)+θ1(size)2
或者:
h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 1 s i z e h_\theta(x)=\theta_0+\theta_1(size)+\theta_1\sqrt{size} hθ(x)=θ0+θ1(size)+θ1size
注:如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。
到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案。如:
正规方程是通过求解下面的方程来找出使得代价函数最小的参数的: ∂ ∂ θ j J ( θ ) = 0 {\frac{\partial }{\partial \theta_j}J(\theta)}=0 ∂θj∂J(θ)=0 。 假设我们的训练集特征矩阵为 X X X (包含了 x 0 = 1 x_0=1 x0=1 )并且我们的训练集结果为向量 y y y ,则利用正规方程解出向量 θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy 。 上标 T T T 代表矩阵转置,上标 − 1 -1 −1 代表矩阵的逆。设矩阵 A = X T X A=X^TX A=XTX ,则: ( X T X ) − 1 = A − 1 (X^TX)^{-1}=A^{-1} (XTX)−1=A−1 以下表示数据为例:
即:
运用正规方程方法求解参数:
注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量)。
再次有幸在网上找到了Python代码,代码如下:
import numpy as np
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等价于X.T.dot(X)
return theta
对于正规方程 ( normal equation ),以及它们的不可逆性,这是一种比较深入的概念。
问题如下: θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy
当计算 θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy ,那对于矩阵 X T X X^TX XTX 的结果是不可逆(不可逆矩阵一般称为奇异或退化矩阵)的情况咋办呢?
出现 X T X X^TX XTX 的结果是不可逆的原因可能如下:
1.在所有的特征值中可能有两个或两个以上相关联的特征值,这时可以将相关联的特征值进行等价替换,直至没有相关的特征值,例如预测房价时 x 1 x_1 x1 是以英尺为尺寸规格计算房子,而 x 2 x_2 x2 是以平方米为尺寸规格计算房子,这时两个特征值之间就满足: x 1 = x 2 ∗ ( 3.28 ) 2 x_1=x_2*(3.28)^2 x1=x2∗(3.28)2 ,所以 x 1 x_1 x1 就可以用 x 2 x_2 x2 替代。
2.特征值的数量 n n n 远大于训练集的数量 m m m ,这时会使用一种叫正规化的线性代数的方法,通过删除某些特征或者是使用某些技术,来解决当 m m m 比 n n n 小的时候的问题。即使如果有一个相对较小的训练集,也可使用很多的特征来找到很多合适的参数。
需要说明的时,在现有成熟的线性代数库中,即使矩阵不可逆,也有相应的函数求得伪逆矩阵,以方便计算使用。
梯度下降与正规方程的比较:
梯度下降 | 正规方程 |
---|---|
需要选择学习率 α \alpha α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量 n n n 较大时也能较好适用 | 需要计算 ( X T X ) − 1 (X^TX)^{-1} (XTX)−1 ,如果特征数量 n n n 较大则运算代价也会较大,因为矩阵逆的计算时间复杂度为 O ( n 3 ) O(n^3) O(n3) ,通常来说当小于10000 时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数 θ \theta θ 的替代方法。具体地说,只要特征变量数量小于一万,通常可以使用标准方程法,而不使用梯度下降法。
实际上对于那些分类算法,像逻辑回归算法等算法,并不能使用标准方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题或者一些其他的算法,因为标准方程法不适合或者不能用在它们上。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及特征变量的数量,这两种算法都是值得学习的。
附 θ = ( 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(\theta) = {1\over2m}\sum_{i=1}^{m} {(h_\theta(x^{(i)})-y^{(i)})^2} J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中
h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h_\theta(x)=\theta^TX=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n hθ(x)=θTX=θ0x0+θ1x1+θ2x2+...+θnxn
将向量表达形式转为矩阵表达形式,则有 J ( θ ) = 1 2 ( X θ − y ) 2 J(\theta)={1 \over 2}(X\theta-y)^2 J(θ)=21(Xθ−y)2 ,其中 X X X 为 m m m 行 n n n 列的矩阵( m m m 为样本个数, n n n 为特征个数), θ \theta θ 为 n n n 行 1 1 1 列的矩阵,对 J ( θ ) J(\theta) J(θ) 进行如下变换
J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta)={1 \over 2}(X\theta-y)^T(X\theta-y) J(θ)=21(Xθ−y)T(Xθ−y)
= 1 2 ( θ T X T − y T ) ( X θ − y ) ={1 \over 2}(\theta^TX^T-y^T)(X\theta-y) =21(θTXT−yT)(Xθ−y)
= 1 2 ( θ T X T X θ − θ T X T y − y T X θ − y T y ) ={1 \over 2}(\theta^TX^TX\theta-\theta^TX^Ty-y^TX\theta-y^Ty) =21(θTXTXθ−θTXTy−yTXθ−yTy)
接下来对 J ( θ ) J(\theta) J(θ) 求偏导,需要用到以下几个矩阵的求导法则:
d A B d B = A T \frac{d AB}{d B}=A^T dBdAB=AT
d X T A X d X = 2 A X \frac{d X^TAX}{d X}=2AX dXdXTAX=2AX
所以有:
∂ J ( θ ) ∂ θ = 1 2 ( 2 X T X θ − X T y − ( y T X ) T − 0 ) \frac{\partial J(\theta)}{\partial \theta}={1 \over 2}(2X^TX\theta-X^Ty-(y^TX)^T-0) ∂θ∂J(θ)=21(2XTXθ−XTy−(yTX)T−0)
= 1 2 ( 2 X T X θ − X T y − X T y − 0 ) ={1 \over 2}(2X^TX\theta-X^Ty-X^Ty-0) =21(2XTXθ−XTy−XTy−0)
= X T X θ − X T y =X^TX\theta-X^Ty =XTXθ−XTy
令 ∂ J ( θ ) ∂ θ = 0 \frac{\partial J(\theta)}{\partial \theta}=0 ∂θ∂J(θ)=0
则有 θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy