笔记:机器学习——吴恩达 第二周

课程目录

四、多变量线性回归(Linear Regression with Multiple Variables)
4.1 多维特征
4.2 多变量梯度下降
4.3 梯度下降法实践1-特征缩放
4.4 梯度下降法实践2-学习率
4.5 特征和多项式回归
4.6 正规方程
4.7 正规方程及不可逆性(选修)

五、Octave教程(Octave Tutorial)
5.1 基本操作
5.2 移动数据
5.3 计算数据
5.4 绘图数据
5.5 控制语句:for,while,if语句
5.6 向量化 
5.7 工作和提交的编程练习


笔记内容


四、多变量线性回归(Linear Regression with Multiple Variables) 

4.1 多维特征 

      目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,例如房间数、楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)。


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

扫描二维码关注公众号,回复: 1563235 查看本文章

       n    代表特征的数量 

         代表第 i 个训练实例,是特征矩阵中的第 i 行,是一个向量(vector)。比方说,上图的 

         代表特征矩阵中第 i 行的第 j 个特征,也就是第 i 个训练实例的第 j 个特征。 如上图的  

       支持多变量的假设 h 表示为:

       这个公式中有 n+1 个参数和 n 个变量,为了使得公式能够简化一些,引入 x0=1

       此时模型中的参数是一个 n+1 维的向量,任何一个训练实例也都是 n+1 维的向量,特征矩阵 X 的维度是 m*(n+1)。 因此公式可以简化为: 。


4.2 多变量梯度下降 

       与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和,即: ,其中:

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

       多变量线性回归的批量梯度下降算法为:          即:

                                             

      

       求导数后得到:                                               当n>=1时,

                   

          随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。 


4.3 梯度下降法实践 1-特征缩放 

       在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。 

       以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000 平方英尺,而房间数量的值则是 0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。

           

         解决的方法是尝试将所有特征的尺度都尽量缩放到-1 到 1 之间。如图: 

             

       最简单的方法是令:

            


4.4 梯度下降法实践 2-学习率 

       梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,不能提前预知,但可以通过绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。 


       有一些可以自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如 0.001)进行比较,但通常看上面这样的图表更好。 

       梯度下降算法的每次迭代会受到学习率的影响,如果学习率 α 过小,则达到收敛所需的迭代次数会非常高;如果学习率 α 过大,则每次迭代可能不会减小代价函数,因为会越过局部最小值导致无法收敛。 通常可以考虑尝试些学习率: α=0.01,0.03,0.1,0.3,1,3,10


4.5 特征和多项式回归 

       线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:,  或者三次方模型:


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

       根据函数图形特性,我们还可以使: 

       或者:

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


4.6 正规方程 

       到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案。如: 


        正规方程是通过求解,来找出使得代价函数最小的参数的。假设我们的训练集特征矩阵为 X(包含了 x0=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量      

        设矩阵 ,则:

        以下表示数据为例: 

        

         即:

        

      运用正规方程求解参数:

       

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

       梯度下降与正规方程的比较: 

         

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

       随着我们要讲的学习算法越来越复杂,例如当讲到分类算法中逻辑回归算法,并不能使用正规方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。
       但对于这个特定的线性回归模型,正规方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的。 


4.7 正规方程及不可逆性(可选) 

       在这段视频中谈谈正规方程 ( normal equation ),以及它们的不可逆性。由于概念较为深入,所以这段为可选材料。 

       当计算  时,若矩阵 X'X 的结果是不可逆的咋办? 

       问题的重点在于 X'X 的不可逆的问题很少发生。并且在 Octave 里,有两个函数可以求解矩阵的逆,一个被称为 pinv(),另一个是 inv(),一个是所谓的伪逆,另一个被称为逆。使用 pinv() 函数可以展现数学上的过程,这将计算出 θ 的值,即便矩阵 X'X是不可逆的。 

       若你想用大量的特征值来尝试实践你的学习算法,可能会导致矩阵 X'X 的结果是不可逆的。 具体地说,在 m 小于或等于 n 的时候,例如,m 等于 10 个的训练样本有 n 等于100 的特征数量,这将会变成一个 101维的矢量。尝试从 10 个训练样本中找到满足 101 个参数的值,这并不是一个好主意。

       通常,我们可以使用一种叫做正则化的线性代数方法,解决使用小数据样本得到 100 或 101 个参数的问题。通过删除某些特征或者是使用某些技术,即使你有一个相对较小的训练集,也可用来找到很多的特征相合适的参数。 

       总之当你发现的矩阵 X'X 的结果是奇异矩阵,或者找到的其它矩阵是不可逆的,建议首先,看特征值里是否有一些多余的特征,像这些 x1 和 x2 是线性相关的,如果有多余的就删掉,直到他们不再是多余的为止。如果特征数量实在太多,就删除某些特征,用较少的特征来反映尽可能多内容。否则可能需要考虑使用正规化方法。 

       如果矩阵 X'X 是不可逆的(通常来说,不会出现这种情况),可以使用不同的线性代数库中的伪逆方法。即使 X'X 的结果是不可逆的,但算法执行的结果也是正确的。总之,出现不可逆矩阵的情况极少发生,所以在大多数实现线性回归中,不应该过多的关注 是不可逆的。 


5.6 向量化 

      无论你是用MATLAB 、 Python、NumPy 或 Java C C++,所有这些语言都具有各种线性代数库,这些库文件都是内置的,容易阅读和获取,并且已经经过高度优化。 
       如果能好好利用这些线性代数库,或者数值线性代数库,并联合调用它们,而不是自己去做那些函数库可以做的事情。那么通常你会发现:这样会更有效,运行速度会更快,并且能更好地利用你的计算机里可能有的一些并行硬件系统等等;这也意味着你可以用更少的代码来实现你需要的功能。实现的方式更简单,代码出现问题的有可能性也就越小。 

       这是一个常见的线性回归假设函数:       

       右边求和,可以自己计算出 j =0 到 j = n 的结果。但换另一种方式来想想,把 hθ(x) 看作 ,那么你就可以写成两个向量的内积,这两种思考角度,会给你两种不同的实现方式。 假设有两个特征量,n =2,并把 x 看作 x0、x1、x2,则



        左边一个未向量化的代码实现方式,我们用一个 for 循环对 n 个元素进行求和。 作为比较,右边是向量化的代码实现:把 x 和 θ 看做向量,只需要令变量 prediction 等于 theta 转置乘以 x。通过一个库来做内积,便可得到一段更简单、更有效的代码。 

       现在,让我们来看一个更为复杂的例子,这是线性回归算法梯度下降的更新规则: 


       你可以用 for 循环,就是让 j 等于 0、等于1、等于 2,来更新 θj。 但让我们用向量化的方式,便可一次实现这三个方程。 

       让我们来看看怎样能用这三步,并将它们压缩成一行向量化的代码来实现。做法如下: 

       我打算把 θ 看做一个向量,然后我用 θ-α 乘以某个别的向量δ 来更新 θ。 这里的 δ 等于

        即把 θ 看作一个n+1 维向量,α 是一个实数,δ 为一个n+1维向量。 

 

       所以这个减法运算是一个向量减法,因为 α 乘以 δ是一个向量,所以 θ 就是 θ- αδ 得到的向量。 

       向量 δ :                                               向量x(i): 

                                                   

     你就会得到这些不同的式子,然后作加和。 


     

       步骤是有逻辑的,所以建议观看视频。如果实在不能理解它们数学上等价的原因,直接实现这个算法,也是能得到正确答案的。但如果你能弄清楚为什么这两个步骤是等价的,可以对向量化有一个更好的理解。

      有时我们使用几十或几百个特征量来计算线性回归,当你使用向量化地实现线性回归,通常运行速度就会比你以前自己写代码用for 循环快的多。 因此使用向量化实现方式,能够得到一个高效得多的线性回归算法。

猜你喜欢

转载自blog.csdn.net/zhuangv587/article/details/80512540