我正在尝试了解梯度下降算法。
在给定另一条最合适的行的情况下,此处的代码应选择一条更合适的最合适的行。该函数将当前最佳拟合线的斜率和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的混淆。
答案 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
,您的成本也保持不变。
现在Li
和m
的部分差异给出了
Li_m = (1/N) *2 * (yi - (m*xi + b)) * -xi
= -(2/N) * xi * (yi - (m*xi + b))
Li
和b
的部分区分给出了
Li_b = (1/N) * 2 * (yi -(m*xi + b)) * -1
= (-2/N) * (yi - (m*xi + b))