zoukankan      html  css  js  c++  java
  • 吴恩达《机器学习》第四章:多元线性回归

    四、多元线性回归

    多特征下的假设形式:
    在这里插入图片描述

    4.1 特征缩放

    特征缩放:Feature Scaling,对模型特征的数量级进行放大缩小,使之都在相*或者同一数量级上;

    Q:为什么要引入特征缩放?
           ~~~~~~       对于有两个特征的房价预测模型,特征1是房屋大小,特征2是卧室数量,房屋大小可能几百*方米,而卧室数量只有几个,二者的数量级不在一个等级,因此对于特征1如果要梯度下降的话,需要移动很多步,或者沿着很复杂的路径,需要很多时间,最后画出来的代价函数等值线的偏移会很大(很扁的椭圆);
    在这里插入图片描述
           ~~~~~~       通过特征缩放,将两个特征的量级置于同一等级,范围一般控制在 [0,1] 或者 [-1,1] ;

           ~~~~~~       特征缩放适用于数量等级差别大的特征,如果相差不大,比如0<= x1 <=3,-2<= x2 <=0.5,那么就不用考虑缩放,梯度下降法会正常地工作;如果再来个特征-100<= x3 <=100 或者 -0.0001<= x4 <=0.0001,那就要进行缩放了;
    在这里插入图片描述

    均值归一化:Mean normalization,对特征值采取 (值-均值)/(最大值) 的动作,从而使各特征的数量级处于相*水*;

    在这里插入图片描述
    特征缩放并不要求精确缩放,只是为了让梯度下降的速度更快一点而已;

    4.2 学习率α

    1、梯度下降算法正确运行的情况

           ~~~~~~       迭代次数越多 -> 代价函数值越小 -> 代价函数减小得越慢 -> 最终收敛;
    在这里插入图片描述
           ~~~~~~       不同的问题,其收敛所需要的迭代次数都不相同,可以通过自动收敛测试(automatic convergence test)来测试到达第n此迭代时,代价函数接*收敛;原理就是设置一个阈值p,当下一步迭代的代价函数值与上一步迭代的代价函数值之差小于这个阈值p时,说明收敛;Jθ( iteration (n+1) ) - Jθ( iteration (n) ) < p;
           ~~~~~~       但由于阈值p难以确定,通常不建议使用这种方法,还是通过 代价函数值-迭代次数 曲线图来判断比较直接;

    2、梯度下降算法运行错误的情况:
    在这里插入图片描述
           ~~~~~~       若曲线上升,则说明过大的学习率使得每一步幅度太大,导致代价函数发散;进一步降低学习率后,发现曲线时升时降,那么还是说明学习率较大,应进一步降低;
           ~~~~~~       实验证明,只要学习率α足够小,那么就能保证每一次迭代都会导致代价函数值下降;但过小的α带来高准确性的同时,也会导致收敛缓慢,大大增加运行时间;所以,选择合适的学习率对于梯度下降算法很重要;

    Q:如何选择合适的学习率α?
           ~~~~~~       按一定的规律不断尝试α,比如0.001, 0.003, 0.01, 0.03, 0.1, 0.3,1 .....,通过做 不同学习率的迭代次数-代价函数值图像来比较选择;

    4.4 特征和多项式

    定义新的特征:
           ~~~~~~       比如,房价预测中特征1为房屋所占土地长,特征2为房屋所占土地宽,那么hθ(x)=θ01x12x2;如果没有对长或者宽有特殊的要求,那么我们可以将两个特征转换为1个特征 -> 面积 s=x1 * x2,这样就把二元转换成了一元
           ~~~~~~       有时候定义一个新的特征可以得到更好的模型,而有时候却不这样;以上面模型为例,当定义面积这个特征后,我们发现:不同的长宽可以得到相同的面积,那么价格也一样,那一个长10m2宽10m2的房子和一个长100m2宽1m2的房子,它们俩价格能一样吗?
           ~~~~~~       所以,是否定义一个新的特征应根据实际情况、模型要求做出调整,调整的好才能达到优化模型的效果;

    多项式回归 -> 多元线性回归:
    在这里插入图片描述
           ~~~~~~       根据函数的了解和数据的走势,确定合适的多项式很重要,这里如何选择二次多项式,那么在后面是一个下降的趋势,是凸的,而房价不可能随着房屋尺寸变大而降低,所以不能选二次多项式;
           ~~~~~~       将多项式转换为多元一次方程式,也要考虑特征缩放,因为特征量级发生了变化;
           ~~~~~~       通过对*方根函数的了解,我认为它更适用于这个模型,因为它后面是一个上升缓慢的趋势,与数据的走势吻合度较高; h θ ( x ) = θ 0 + θ 1 ( size ) + θ 2 ( size ) h_{ heta}(x)= heta_{0}+ heta_{1}( ext {size})+ heta_{2} sqrt{( ext {size})} hθ(x)=θ0+θ1(size)+θ2(size)

    4.4 正规方程

    正规方程:Normal Eqution,通过导数值为零的点为原函数最小值这一原理从而直接找到代价损失函数J(θ)的最小值,从而确定θ;

           ~~~~~~       不需要多次迭代,一步就能走到代价函数的最小点;原理是基于函数的求导,比如一元二次函数的导数为0的点即为最小点,对于多元函数就求偏导;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
           ~~~~~~       对于正规方程的推导,吴恩达老师并未给出详细的解释,只是说这个方程能求出最小的θ;此外,使用正规方程不需要考虑特征缩放,这是一大优点

    在网上搜了一下正规方程的推导过程,总结如下:
    首先代价函数如下:
    J ( θ ) = ∑ i = 1 n ( y i − y i ′ ) 2 = ∑ i = 1 n ( y i − h θ ( x i ) ) 2 = ( y − h θ ( X ) ) T ∗ ( y − h θ ( X ) ) J_{( heta)}=sum_{i=1}^{n}left(y_{i}-y_{i}^{prime} ight)^{2}=sum_{i=1}^{n}left(y_{i}-h_{ heta}left(x_{i} ight) ight)^{2}=(y-h_{ heta}(X))^{T} *(y-h_{ heta}(X)) J(θ)=i=1n(yiyi)2=i=1n(yihθ(xi))2=(yhθ(X))T(yhθ(X))
    因为
    h θ ( X ) = θ ∗ X h_{ heta}(X)= heta * X hθ(X)=θX
    所以
    J ( θ ) = ( y − X ∗ θ ) T ∗ ( y − X ∗ θ ) J_{( heta)}=(y-X * heta)^{T} *(y-X * heta) J(θ)=(yXθ)T(yXθ)
    我们要得到J(θ)最小值多对应的θ,那么就要上面这个公式就要对θ求导,令其导数值为0;
    矩阵求导是这样的:
    d A B d B = A T frac{d A B}{d B}=A^{T} dBdAB=AT
    d X T A X d X = 2 A X frac{d X^{T} A X}{d X}=2 A X dXdXTAX=2AX
    那么我们对θ求导后得出:
    d d ( θ ) ( y − X ∗ θ ) T ∗ ( y − X ∗ θ ) = 2 X T ∗ ( y − X ∗ θ ) = 0 frac{d}{d( heta)}(y-X * heta)^{T} *(y-X * heta)=2 X^{T} *(y-X * heta)=0 d(θ)d(yXθ)T(yXθ)=2XT(yXθ)=0
    展开后得到:
    2 X T ∗ y = 2 ∗ X T ∗ X ∗ θ 2 X^{T} * y=2 * X^{T} * X * heta 2XTy=2XTXθ
    那么:
    θ = ( X T ∗ X ) − 1 ∗ X T ∗ y heta=left(X^{T} * X ight)^{-1} * X^{T} * y θ=(XTX)1XTy
    这个θ即对应最小的代价函数值J(θ);

    梯度下降法VS正规函数:

    梯度下降正规函数
    学习率α需要选择不需要
    迭代次数需要很多次一次到位,不用考虑迭代次数
    特征缩放需要考虑不需要
    数据量大时当数据上万时,表现较好(XTX)-1使得时间复杂度为O(n3),万以下的数据现代计算机还是能很快得出结果

           ~~~~~~       所以,对于上万级别的数据量,我们要考量两者了,看是否选择梯度下降法,而万以下的数据量,毫无疑问我们会选择正规函数,基于它有众多的优点;

  • 相关阅读:
    运行了unittest没有结果返回
    python学习笔记11.2-unittest的使用与报告生成
    python学习笔记11.1-类的继承与动态属性的设置
    docker概念
    python学习笔记10-方法
    python学习笔记9-类和对象
    python学习笔记8-异常处理
    python学习笔记2-字典和列表
    3.JavaScript-语法、关键保留字及变量
    如何实现导航菜单栏中的二级下拉菜单?
  • 原文地址:https://www.cnblogs.com/Luweir/p/14147238.html
Copyright © 2011-2022 走看看