梯度下降算法,梯度步进功能

时间:2018-07-14 03:23:51

标签: python machine-learning artificial-intelligence gradient-descent

我正在尝试了解梯度下降算法。

在给定另一条最合适的行的情况下,此处的代码应选择一条更合适的最合适的行。该函数将当前最佳拟合线的斜率和y轴截距作为输入,以及名为“点”的2维数据集和learningRate。这是我正在使用的代码:

def step_gradient(b_current, m_current, points, learningRate):
    b_gradient = 0                                                      #Initialize b_gradient to 0
    m_gradient = 0                                                      #Initialize m_gradient to 0
    N = float(len(points))                                              #Let N be the number of data points
    for i in range(0, len(points)):                                     #Iterate through dataset "Points"
        x = points[i,0]
        y = points[i,1]
        b_gradient += -(2/N) * (y - ((m_current * x) + b_current))      #gradient is calculated as the derivative
        m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))
    new_b = b_current - (learningRate * b_gradient)
    new_m = m_current - (learningRate * m_gradient)
    return[new_b, new_m]

但是我不明白for循环内发生了什么。

我知道for循环的前两行将x和y迭代地分配给数据集中名为“ points”的下一个数据点。

我不明白如何计算b_gradient和m_gradient。

据我所知,b_gradient是数据集中每个点相对于b的所有偏导数之和。但是,我真正的问题是,如何行:

b_gradient += -(2/N) * (y - ((m_current * x) + b_current))

计算相对于b的偏导数?

-(2 / N)是什么?

有人可以解释一下这行代码是如何表示该数据集中某个点相对于b的偏导数的吗?

m_gradient的混淆。

2 个答案:

答案 0 :(得分:2)

b_gradient和m_gradient是成本/误差函数相对于b / m的偏导数。这就是为什么存在-2 / N的原因,因为1 / N是成本/误差函数的一部分,并且在计算导数后将其乘以2。

如果您不了解微积分,则只需暂时考虑一下。如果这样做,则很容易得出。

答案 1 :(得分:0)

系统中每个数据点(xi, yi)对成本(损失)的贡献为。

`Li = (1/N) * (yi - (m*xi + b))**2

总费用将是所有Li-s的总和。您有N个数据点,并且(1/N)是一个归一化的术语,因此即使更改N,您的成本也保持不变。

现在Lim的部分差异给出了

Li_m = (1/N) *2 * (yi - (m*xi + b)) * -xi
     =  -(2/N) * xi * (yi - (m*xi + b))

Lib的部分区分给出了

Li_b = (1/N) * 2 * (yi -(m*xi + b)) * -1
     =  (-2/N) * (yi - (m*xi + b))