• Supervised learning demo


    监督学习案例

    规范

    • 假设函数: 使用h(hypothesis, 假设)表示
    • 输入(input value)
      • 向量或者实数: 使用小写字母x等
      • 矩阵: 使用大写字母X等
    • 输出(output value)
      • 向量或者实数: 使用小写字母y等
      • 矩阵: 使用大写字母Y等
    • 参数(Parameters): ( heta)
    • 样本的数量(列数): m
    • 样本中特征(feature)的个数: n
    • (x_0^{(1)}): 0表示第0个特征(为我们给出的样本中的特征是从1开始的,这里的0是我们自己添加上去的,所有的(x_0^{(m)})都为1,其中1表示第几行数据, 它的一般式就是(x_j^{(i)}), 以后j表示第几个特征,i表示第几个样本

    房价的Size和Price的预测

    • X 为 房子的 Size

    • 建立一个线性模型: (h_ heta(x) = heta_0 + heta_1x)

    • 要让我们fit的model与y差异最小, 称之为最小化(minimize)

      • 在这个案例中使用$$J( heta_0, heta_1) = {1over2m}sum_{i = 0}m(h_ heta(x{(i)}) - y{(i)})2$$
      • 上面的就是我们的代价函数(cost function), 因为我们有让得到的和除以了2m, 所以我们的到函数也称之为平均误差函数(squared error function), 注意: cost function的自变量时theta_0和theta_1, 不在是我们熟悉的x了
      • [{minimize_{ heta_0 heta_1}} J( heta_0, heta_1)$$表示求出一个$ heta_0$和$ heta_1$使得$J( heta_0, heta_1)$的值最小, 我们称之为最小化的过程, 上面的这个表达式就是我们的优化目标(optimization objective), 也就是我们的目标函数 ]

    • 使用gradient regression梯度降维求出最优解, 梯度降维的公式为( heta_0 := heta_0 - alpha imes {partialoverpartial heta_0}J( heta_0, heta_1)), 对于另一个( heta_1)也是一样的, ( heta_1 := heta_1 - alpha imes {partialoverpartial heta_1}J( heta_0, heta_1)), 上面的是公式, 在实际更新我们的参数( heta_0, heta_1)的时候, 应该保证( heta_0, heta_1)同步更新, 所以应该这样子$$tmp0 := heta_0 - alpha imes {partialoverpartial heta_0}J( heta_0, heta_1)$$ $$tmp1 := heta_1 - alpha imes {partialoverpartial heta_1}J( heta_0, heta_1)$$ $$ heta_0 := tmp0$$ $$ heta_1 := tmp1$$, 在最后同步更新( heta_0)( heta_1)的值

    • 关于梯度下降公式的细节

      • 公式中, (alpha)表示学习率, ({partialoverpartial heta_0}J( heta_0, heta_1))表示梯度下降的方向, 所以(alpha imes {partialoverpartial heta_0}J( heta_0, heta_1))表示( heta_0)要更新多少的值, 形象一点就是说, 一个人在一个山顶上, 他步子的大小为(alpha), 他希望尽快下山的方向为({partialoverpartial heta_0}J( heta_0, heta_1)), 这样我们就可以更新( heta_0)的值了
      • 虽然我们在公式中规定了(alpha)学习率, 但是并不代表我们走的每一步就是不变的, 因为导数是在变化的, 为最低点的时候为0, 在其他地方有时别的值
      • 要应用梯度下降法, 我们需要为( heta_0)( heta_1)进行初始化, 一般来说都初始化为0, 但是也要视情况而定
      • 什么时候停止梯度下降?
        • 我们可以规定一个阈值, 当我们的(alpha imes {partialoverpartial heta_0}J( heta_0, heta_1))小于这个阈值的时候停止, 这个是通过计算机自动停止迭代的, 但是不推荐使用
        • 另外一种方式就是通过画出(minimize_{ heta_0 heta_1}J( heta_0, heta_1))与迭代次数的图像来判断应该迭代多少次, 如果画出来的是一个抛物线则表示我们设置的(alpha)学习率太大了, 应该减小(alpha)的值
    • 其他

      • 对于这个房价的模型, 我们除了使用梯度下降的方法求出我们的目标函数之外还可以使用matrix的方法来求, 这个更加的简单
      • 我们每求一次(J( heta_0, heta_1))的值就要遍历一遍所有的数据, 因为the definition of the (J( heta_0, heta_1)) is $$sum_{i=1}{m}{1over2m}{(h(x{(i)}) - y{(i)})2})$$, 这种方式我们称之为Batch梯度下降

    房价的Size和Price的预测-其他解决方案

    • 在上一节中我们已经得到了一个线性模型(h_ heta(x) = heta_0 + heta_1x),根据这个假设函数我们定义出了一个目标函数(也称之为损失函数)$$J( heta_0, heta_1) = {1 over 2m}sum_{i = 0}{m}(h(x{(i)}) - y{(i)})2$$接着通过梯度下降的方法计算出(minimize_{ heta_0 heta_1}J( heta_0, heta_1)), 我们知道这种方法需要对进行迭代,比较麻烦,那有没有更加简单的方法呢?能不能一次迭代就可以求出我们的( heta_0)( heta_1)呢?答案就是正规方程

    • 正规方程: ( heta = (A^{T}A)^{-1}A^{T}y)

      • 其中( heta)为一个列向量, 表示我们所有的参数

        [egin{bmatrix} heta_0 \ heta_1 end{bmatrix} ]

      • A 表示输入的 x 组成的矩阵, 这里就是

        [egin{bmatrix} 1 & x_1^{(1)} \ 1 & x_1^{(2)} \ vdots & vdots \ 1 & x_1^{(m)} end{bmatrix} ]

        上面的矩阵的原型就是

        [egin{bmatrix} x_0^{(1)} & x_1^{(1)} \ x_0^{(2)} & x_1^{(2)} \ vdots & vdots \ x_0^{(m)} & x_1^{(m)} end{bmatrix} ]

        从上面我们可以知道(x_0^{(n)})是值为1,这里的

        [egin{bmatrix} x_0^{(1)} \ x_0^{(2)} \ x_0^{(3)} \ vdots \ x_0^{(m)} end{bmatrix} ]

        • 就是我们自己添加上去的新的特征值,这个特征比较特殊,因为它所有的值都为0,为什么要这样做?通过观察假设函数(h(x^{(i)}) = heta_0 imes 1 + heta_1x^{(i)})我们发现,之后( heta_0)没有自变量,为了数学上的统一,于是我们对其进行修改(h(x^{(i)}) = heta_0x_0^{(i)} + heta_1x_1^{(i)}),其中(x_0^{(i)})为1。
      • 其中y为一个列向量,它的值为

      [egin{bmatrix} y^{(1)} \ y^{(2)} \ y^{(3)} \ vdots \ y^{(m)} end{bmatrix} ]

      (x_j^{(i)})对象的标签值

    • 如果构建 A ?

      • 首先,在书写假设函数的时候应该安装阶数的升序书序,如(h(x^{(i)}) = heta_0 + heta_1x_1^{(i)} + heta_2{(x_1^{(i)})}^2)或者(h(x^{(i)}) = heta_0 + heta_1x_1^{(i)} + heta_2x_2^{(i)})分别从方便的式子中构建 A

        第一个是

        [egin{bmatrix} 1 & x_1^{(1)} & {(x_1^{(1)})}^2 \ 1 & x_1^{(2)} & {(x_1^{(2)})}^2 \ vdots & vdots & vdots \ 1 & x_1^{(m)} & {(x_1^{(m)})}^2 \ end{bmatrix} ]

        第二个是

        [egin{bmatrix} 1 & x_1^{(1)} & x_2^{(1)} \ 1 & x_1^{(2)} & x_2^{(2)} \ vdots & vdots & vdots \ 1 & x_1^{(m)} & x_2^{(m)} \ end{bmatrix} ]

    • 如果已经构建出了矩阵 A,接下来的y的构建是非常简单的,就是安装y给出的顺序构建一个列向量即可

    • 带入公式就可以直接求出 ( heta)

    • 正规方程的优点

      • 不需要像梯度下降法一样麻烦,需要换出(minimize_{ heta_0 heta_1}J( heta_0, heta_1))和迭代次数的图像来确定迭代的次数,除此之外还要确定出(alpha)学习率的大小
      • 不需要进行Feature Scaling, 也就是对数据进行标准化, 如果进行了标准化返回会降低准确度
    • 正规方程的缺点

      • 在公式中发现这个A矩阵包含了所有的输入,如果输入量非常的大,则A矩阵就会非常大,在计算({(A^{T}A)}^{-1})矩阵的维度就会增大,并且求矩阵的逆在大数据的情况下是非常消耗计算机的性能的
      • 使用的范围小,只适用于线性回归,而梯度下降使用的范围要广很多

    房价的Size和Price的预测-多变量

    • 在上两节中我们只考虑到了房子的大小和房子的关系,当然这个是不包括我们计自己添加上去的第0个特征,它们的值都为1。下面我们再添加一些特征,下面就添加 Age。

    • 此时我们的假设函数为(h(x^{(i)}) = heta_0 + heta_1x_1^{(i)} + heta_2x_2^{(i)}),其中(x_1^{(i)})为size输入,(x_2^{(i)})为age的输入,构建目标函数(cost function)$$J( heta_0, heta_1, heta_2) = {1 over 2m}sum_{i = 0}{m}(h(x{(i)}) - y^{(i)})$$,为了方便起见,***通常我们会将向量输入到函数中而不是一个实数,因为在编程中我们就是输入向量或者矩阵的$$J( heta) = {1 over 2m}sum_{i = 0}{m}(h(x{(i)}) - y^{(i)})$$其中,( heta)是一个向量,它的值为$$
      egin{bmatrix}
      heta_0
      heta_1
      heta_2
      end{bmatrix}

    [*** + 接下来就是我们熟悉的步骤了通过画出$minimize_{ heta_0, heta_1, heta_2}J( heta_0, heta_1, heta_2)$和迭代次数的图求出应该迭代几次,关于$minimize_{ heta_0, heta_1, heta_2}J( heta_0, heta_1, heta_2)$$的值已经在前几节讲过了,使用梯度下降的方法 ]

    tmp0 := heta_0 - alpha imes {partialoverpartial heta_0}J( heta)

    []

    tmp1 := heta_1 - alpha imes{partialoverpartial heta_1}J( heta)

    []

    tmp2 := heta_2 - alpha imes{partialoverpartial heta_2}J( heta)

    []

    heta_0 := tmp0
    heta_1 := tmp1
    heta_2 := tmp2

    [在最后同步更新$ heta_0$, $ heta_1$和$ heta_2$的值,道理都是一样的 ## 另外的思考-房子的宽(width)和长(length)对房价进行预测 + 根据标题知道,题目给出了两个特征width和length,我们当然可以和上一节那样构建假设函数,上一节的假设函数绝对是首选,但是如果拟合的不好呢?这就意味着我们需要重新构建假设函数,现在我们构建一个新的假设函数$h(x^{(i)}) = heta_0 + heta_1{x_1^{(i)}} + heta_2{(x^{(i)})}^{2}$,我们发现这与我们之前的假设函数不一样的地方在于有2阶,这个地方就有***技巧***了,***将${x_1^{(i)}}$看成一个新的特征$xnew_1^{(i)}$ 和 ${(x_2^{(i)})}^{2}$看成另外一个新的特征$xnew_2^{(i)}$,这样子我们的假设函数就又成为了一阶了的,操作步骤就和之前的一样了*** ## 对数据的处理 #### 在获取到需要训练的数据的时候,我们需要对数据进行去均值化 + 什么是去均值化 - 去均值化就是将我们的一列数据的范围固定到$-1 o 1$$这个范围之间,但是这个范围不是硬性要求,可以在这个区间内波动 - 公式: ]

        v = {{x - avg} over {max - min}}
        $$
        
        * v 为去均值之后的数据样本列向量
        * x 为待去均值的数据样本列向量
        * avg 为 x 的均值
        * max 为 x 的最大值
        * min 为 x 的最小值
        * 还是要提的是***x是一个列向量,就是我们数据表中的一列,就是$x_j^{(i)}$中的第j个特征的所有的值***
        
    - 举例:
        * 假设我们的房价中size的范围是在(0, 3000)区间内,可想而知有10,有200, 有3000,这样数据之间的差异太大了,对我们的拟合时候影响的,如果我们使用梯度下降发进行最小化,因为数据差异大,会导致最小化的速度变慢
        
        * 使用公式
        $$
        v = {{x - avg} over {max - min}}
        $$
        得到的v,它所有元素的大小都在$-1 	o 1$区间内
    
    • 为什么要去均值

      • 很简单,为了在使用梯度下降的方法进行最小化的时候加快速度
    • 执行去均值之后,我们应该保存mean和std,因为我们使用的是去均值之后的数据拟合的模型,在使用这个模型的时候,我们也要对输入进行去均值,这样拟合出来的数据才是我们需要的。

    所有在之前的案例中,我们应该加上去均值这一步

  • 相关阅读:
    开放6379端口
    synchronized 实现同步的基础
    pythoning—— 5:实战篇(购物车)
    pythoning ——3、数据类型(字符串)
    pythoning ——2、数据类型(元组、序列)
    pythoning ——1、基础篇
    暗链/黑链
    什么是webshell
    获取当前设备IP
    生成公钥
  • 原文地址:https://www.cnblogs.com/megachen/p/9903433.html
Copyright © 2020-2023  润新知