zoukankan      html  css  js  c++  java
  • 机器学习实战

    机器学习实战 - 读书笔记(05) - Logistic回归

    解释

    Logistic回归用于寻找最优化算法。

    • 最优化算法可以解决最XX问题,比如如何在最短时间内从A点到达B点?如何投入最少工作量却获得最大的效益?如何设计发动机使得油耗最少而功率最大?
      我们可以看到最XX问题,有寻找最小(最短时间)和最大等。

      • 解决最小类问题会使用梯度下降法。可以想象为在一个山坡上寻找最陡的下坡路径。
      • 同理,解决最大类问题会使用梯度上升法。可以想象为在一个山坡上寻找最陡的上坡路径。
    • 寻找最优化算法,可以通过试图找到一个阶跃函数(step function),由于阶跃函数只返回0或者1.因此这个阶跃函数可以作为分类器。

    • 一个方案是利用Sigmoid函数做出一个阶跃函数。

    (sigma(z) = frac{1}{1 + e^{-z}})
    在人工神经网络中,Sigmoid函数是一种常见的激活函数(activation function)。
    通过Sigmoid函数的曲线可以看出,其返回值在0到1之间,大部分值都贴近0或者1.只有z在0附近时,形成一个上升曲线,z=0是,返回值是0.5.
    因此当Sigmoid函数返回值大于0.5,这个阶跃函数返回1,否则返回0.

    • 这时,问题变成如何算z。

    (z = w_0x_0 + w_1x_1 + ... + w_nx_n)
    如果采用向量的写法,上述公式可以写成
    $ z = w^Tx( 它表示将这两个数值向量的对应元素相乘然后全部加起来即得到z值。其中的向量x是分类器的输入数据,向量w也就是我们要找到的最佳参数(系数),从而使得分类尽可能地精确. 这是一个线性函数。(为什么一定是线性函数?线性方程可以想象为一条直线(2维情况下),或者一个平面(3维情况下),第一:线性函数是递增或者递减的,复合sigmoid函数的要求,第二:比较好解。) 或者说这是一个多元一次方程,我们要根据训练数据算出最佳的)w_0, ... w_n$.

    技巧1: 加入不变量。
    比如在一元一次方程中(z=w_0x_0),由于没有常数项,就限制求出最佳解。因此可以变成(z=w_0x_0 + w_1x_1),其中(x_0 = 1)。这就是为什么书中的代码中加入1.0列的原因。

    • 如果求解w? 如果是求最大类问题,我们使用梯度上升算法的迭代公式。

    (w:= w + alpha abla wf(w))
    其中,(alpha)为步长。步长太大会导致震荡,找到的w不精确。步长太小会影响运算效率。步长可以在迭代的过程中改变。

    技巧2: 步长是一个重要的计算参数。正确的计算一个步长很关键。书中使用了动态步长,在计算中步长逐渐缩短。
    从微积分的角度来说,这个公式就是在现在的w上加上激活函数的导数乘以步长。

    • 梯度上升法

    所以梯度上升算法的迭代公式为:
    (w:= w + alpha abla wf(w))
    书中的计算: weights = weights + alpha * (label - sigmoid(sum(dataMatrix[index] * weights)) * dataMatrix[index]
    书中实际的计算公式为:
    $w:= w + alpha (c - f(x)) x ( 其中: )w(是向量。 )alpha(是步长。 )c(是期望值, x的实际分类,值为0或1。 )f(x)(是sigmoid函数。可以是算总和,或者是向量。 )(c - f(x))(有两个作用:一个是提供偏移方向,是增加还是减少。另外一个作用是偏移量的一个因子。如果f(x)是一个阶跃函数,则值为-1,0,1,这种情况下只有第一个作用。对于sigmoid函数,其值的范围[-1, 1]。 )x$是向量。书中似乎认为x越大,偏移量应该越大。
    这个似乎有问题。一个问题是如果所有的x都很大,而且集中在一个区域里,则偏移量似乎过大。
    第二,下面的例子:
    测试数据1:
    [
    [[0, 1], [0]],
    [[0, 2], [0]],
    [[0, 4], [1]],
    [[0, 5], [1]]
    ]
    测试数据2:
    [
    [[10000, 1], [0]],
    [[10000, 2], [0]],
    [[10000, 4], [1]],
    [[10000, 5], [1]]
    ]
    这两个测试数据测分割线都是: (0 = -3 + x_2),和(x_1)无关。
    这个情况下,书中的计算公式明显不正确。
    这也说明这个迭代公式需要根据实际情况调整。

    技巧3: 需要大量的迭代才能算出最优的w。书中对测试数据进行了150迭代。

    其它说明

    • 梯度上升算法的迭代公式

    梯度上升算法用来求函数的最大值。
    (w:= w + alpha abla wf(w))
    其中,(alpha)为步长。步长太大会导致震荡,找到的w不精确。步长太小会影响运算效率。书中的步长是数据size的1/10。步长可以在迭代的过程中改变。

    • 梯度下降算法的迭代公式

    梯度下降算法用来求函数的最小值。
    (w:= w - alpha abla wf(w))

    • Sigmoid函数的导数

    (f'(x) = f(x) [1-f(x)])

    • 梯度上升法,计算梯度

    如果梯度记为( abla),则函数f(x,y)的梯度由下式表示:
    ( abla f(x, y) = inom{frac{ abla f(x, y)}{ abla x}} {{frac{ abla f(x, y)}{ abla y}}})
    这个梯度意味着要沿x的方向移动 (frac{ abla f(x, y)}{ abla x}),要沿y的方向移动 (frac{ abla f(x, y)}{ abla y})

    参考

  • 相关阅读:
    【HYSBZ】1588 营业额统计
    【HYSBZ】1503 郁闷的出纳员
    【ZOJ】3228 Searching the String
    【ZOJ】3494 BCD Code
    【HDU】1754 I Hate It
    【HDU】3247 Resource Archiver
    【POJ】3481 Double Queue
    EdgeCore初学习
    go mod常用命令 已经 常见问题
    GO语言内存操作指导—unsafe的使用
  • 原文地址:https://www.cnblogs.com/steven-yang/p/5605281.html
Copyright © 2011-2022 走看看