算法工程师修仙之路:吴恩达机器学习(三)

吴恩达机器学习笔记及作业代码实现中文版

第三章 多变量线性回归


多维特征

  • 现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为 ( x 1 , x 2 , . . . , x n ) (x_1, x_2, ..., x_n)
    在这里插入图片描述

  • 增添更多特征后,我们引入一系列新的注释:

    • n代表特征的数量。
    • x ( i ) x^{(i)} 代表第i个训练实例,是特征矩阵中的第i行,是一个向量( vector)。
    • x j ( i ) x_j^{(i)} 代表特征矩阵中第i行的第j个特征,也就是第i个训练实例的第j个特征。
  • 支持多变量的假设 ℎ 表示为: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n ℎ_\theta(x) = \theta_0 + \theta_1x_1 +\theta_2x_2+...+\theta_nx_n ,这个公式中有n+1个参数和n个变量,为了使得公式能够简化一些,引入 x 0 = 1 x_0=1 ,则公式转化为: h θ ( x ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n ℎ_\theta(x) = \theta_0x_0 + \theta_1x_1 + \theta_2x_2+...+\theta_nx_n 。此时模型中的参数是一个n+1维的向量,任何一个训练实例也都是n+1维的向量,特征矩阵X的维度是 m*(n+1),因此公式可以简化为: h θ ( x ) = θ T X h_\theta(x)=\theta^TX ,其中上标T代表矩阵转置。

多元梯度下降法

  • 在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即: J ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(\theta_0, \theta_1, ..., \theta_n)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 ,其中 h θ ( x ) = h θ ( x ) = θ T X = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n ℎ_\theta(x) =h_\theta(x)=\theta^TX=\theta_0+ \theta_1x_1 + \theta_2x_2+...+\theta_nx_n

  • 我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。

  • 多变量线性回归的批量梯度下降算法为: θ j = θ j α J ( θ 0 , θ 1 , . . . , θ n ) θ j \theta_j=\theta_j-\alpha*\frac{\partial J(\theta_0, \theta_1, ..., \theta_n)}{\partial \theta_j} ,我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。

    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=\frac{x_n-\mu_n}{s_n} 其中 μ n \mu_n 是平均值, s n s_n 是标准差。
      在这里插入图片描述

学习率

  • 梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。
    在这里插入图片描述

  • 梯度下降算法的每次迭代受到学习率的影响,如果学习率过小,则达到收敛所需的迭代次数会非常高;如果学习率过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。

  • 通常可以考虑尝试这些学习率:0.01, 0.03, 0.1, 0.3, 1, 3, 10,基本每隔三倍左右取一个学习率尝试。

特征和多项式回归

  • 线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型: h θ = θ 0 + θ 1 x 1 + θ 2 x 2 2 ℎ_\theta=\theta_0+\theta_1x_1+\theta_2x_2^2 或者三次方模型: h θ = θ 0 + θ 1 x 1 + θ 2 x 2 2 + θ 3 x 3 3 ℎ_\theta=\theta_0+\theta_1x_1+\theta_2x_2^2+\theta_3x_3^3

  • 通常我们需要先观察数据然后再决定准备尝试怎样的模型。我们可以令 x 2 = x 2 2 x 3 = x 3 3 x_2=x_2^2,x_3=x_3^3 ,从而将模型转化为线性回归模型。

  • 如果我们采用多项式回归模型, 在运行梯度下降算法前, 特征缩放非常有必要。

正规方程

  • 对于某些线性回归问题,正规方程方法是更好的解决方案。

  • 正规方程是通过求解 J ( θ j ) θ j = 0 \frac{\partial J(\theta_j)}{\partial \theta_j}=0 来找出使得代价函数最小的参数的。假设我们的训练集特征矩阵为X(包含了 x 0 = 1 x_0=1 )并且我们的训练集结果为向量y,则利用正规方程解出向量 θ = ( X T X ) 1 X T y \theta=(X^TX)^{-1}X^Ty 。上标 T 代表矩阵转置,上标-1 代表矩阵的逆。

  • 对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。

  • 梯度下降与正规方程的比较:
    在这里插入图片描述

  • 总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数 θ \theta 的替代方法。具体地说,只要特征变量数量小于一万,通常建议使用标准方程法,而不使用梯度下降法。

  • 正规方程的 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
    

正规方程在矩阵不可逆情况下的解决方法

  • 我们称那些不可逆矩阵为奇异或退化矩阵。

  • 如果可以用一个线性方程来展示多个相关联的特征值,矩阵 X T X X^TX 将是不可逆的。

  • 在你想用大量的特征值,尝试实践你的学习算法的时候,在m小于或等于 n 的时候可能会导致矩阵 X T X X^TX 的结果是不可逆的。

  • 当发现的矩阵结果是奇异矩阵,或者找到的其它矩阵是不可逆的,首先,看特征值里是否有一些多余的特征,比如线性相关的特征。同时,当有一些多余的特征时,可以删除这只保留重复特征里的其中一个,将解决不可逆性的问题。因此,首先应该通过观察所有特征检查是否有多余的特征,如果有多余的就删除掉,直到他们不再是多余的为止,如果特征数量实在太多,应该删除些用较少的特征来反映尽可能多内容,否则需要考虑使用正规化方法。

  • θ = ( X T X ) 1 X T y \theta=(X^TX)^{-1}X^Ty 的推导过程

    • J ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(\theta_0, \theta_1, ..., \theta_n)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 ,其中: h θ ( x ) = θ T X = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n ℎ_\theta(x)=\theta^TX=\theta_0x_0+ \theta_1x_1 + \theta_2x_2+...+\theta_nx_n
    • 将向量表达形式转为矩阵表达形式,则有 J ( θ ) = 1 2 ( X θ y ) 2 J(\theta)=\frac{1}{2}(X\theta-y)^2 ,其中X为m行n列的矩阵(m为样本个数,n为特征个数), θ \theta 为n行1列的矩阵,y为m行1列的矩阵。
    • J ( θ ) J(\theta) 进行如下变换: J ( θ ) = 1 2 ( X θ y ) T ( X θ y ) = 1 2 ( θ T X T y T ) ( X θ y ) = 1 2 ( θ T X T X θ θ T X T y y T X θ y T y ) J(\theta)=\frac{1}{2}(X\theta-y)^T(X\theta-y)=\frac{1}{2}(\theta^TX^T-y^T)(X\theta-y)=\frac{1}{2}(\theta^TX^TX\theta-\theta^TX^Ty-y^TX\theta-y^Ty)
    • 接下来对 J ( θ ) J(\theta) 求偏导,需要用到以下几个矩阵的求导法则:
      • d A B d B = A T \frac{dAB}{dB}=A^T
      • d X T A X d X = 2 A X \frac{dX^TAX}{dX}=2AX
    • 所以可以推出: J ( θ ) θ = 1 2 ( 2 X T X θ X T y ( y T X ) T 0 ) = 1 2 ( 2 X T X θ X T y X T y 0 ) = X T X θ X T y \frac{\partial J(\theta)}{\partial \theta}=\frac{1}{2}(2X^TX\theta-X^Ty-(y^TX)^T-0)=\frac{1}{2}(2X^TX\theta-X^Ty-X^Ty-0)=X^TX\theta-X^Ty
    • J ( θ ) θ = 0 \frac{\partial J(\theta)}{\partial \theta}=0 ,则有 θ = ( X T X ) 1 X T y \theta=(X^TX)^{-1}X^Ty

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/84337829