梯度下降的纯Python实现

梯度下降的纯Python实现,python,machine-learning,gradient-descent,Python,Machine Learning,Gradient Descent,我曾尝试使用Python实现梯度下降。我知道在这方面也有类似的话题,但在我的尝试中,我的猜测斜率总是非常接近真实斜率,但猜测截距从未匹配,甚至没有接近真实截距。有人知道为什么会这样吗 另外,我读了很多梯度下降的帖子和公式,上面说每次迭代,我需要用负学习率乘以梯度,然后重复,直到收敛。正如你在我下面的实现中所看到的,我的梯度下降只在学习率乘以梯度而不是-1时起作用。为什么呢?我是否理解梯度下降错误,或者我的实现错误?(如果我将学习率和梯度乘以-1,考试m和考试b将很快溢出) 溢出的原因是缺少系数(

我曾尝试使用Python实现梯度下降。我知道在这方面也有类似的话题,但在我的尝试中,我的猜测斜率总是非常接近真实斜率,但猜测截距从未匹配,甚至没有接近真实截距。有人知道为什么会这样吗

另外,我读了很多梯度下降的帖子和公式,上面说每次迭代,我需要用负学习率乘以梯度,然后重复,直到收敛。正如你在我下面的实现中所看到的,我的梯度下降只在学习率乘以梯度而不是-1时起作用。为什么呢?我是否理解梯度下降错误,或者我的实现错误?(如果我将学习率和梯度乘以-1,考试m和考试b将很快溢出)


溢出的原因是缺少系数
(2/n)
。我已经广泛地展示了负面符号的使用,以获得更多的澄清

import numpy as np
import matplotlib.pyplot as plt

intercept = -5
slope = -4
# y = mx + b

x = []
y = []

for i in range(0, 100):
    x.append(i/300)
    y.append((i * slope + intercept)/300)

n = len(x)
x = np.array(x)
y = np.array(y)

learning_rate = 0.05
exam_m = 0
exam_b = 0
epochs = 1000

for _ in range(epochs):
    gradient_m = 0
    gradient_b = 0
    for i in range(n):
        gradient_m -= (y[i] - exam_m * x[i] - exam_b) * x[i]
        gradient_b -= (y[i] - exam_m * x[i] - exam_b)

    exam_m = exam_m - (2/n)*learning_rate * gradient_m
    exam_b = exam_b - (2/n)*learning_rate * gradient_b

print('Slope, Intercept: ', exam_m, exam_b)

y_pred = exam_m*x + exam_b
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y_pred, '--', color='black', label='predicted_line')
plt.plot(x, y, '--', color='blue', label='orginal_line')
plt.legend()
plt.show()
输出:
坡度、截距:-2.421033215481844-0.2795651051072061604


2/n不是一个常数,我们可以用学习率来代替它吗?而且,当我乘以-1时,它只会溢出。如果我不乘以-1,我的模型一直都可以得到正确的斜率,但不是截距,如果有人实施线性回归,就有这个因素,所以如果你报告你的发现,通过调整学习率而没有这个因素,而其他人试图实施你所做的,但有这个因素,将得到不同的结果。如果它解决了您的问题,请进行投票。好的,谢谢。但还有一个问题,你知道为什么我的ML模型永远不能得到正确的截距吗?这是因为我的学习速度,还是有什么我没有注意到的呢?这取决于函数,也可以通过调整学习速度来接近,但最终它仍然试图近似函数,因为高阶函数ML是获得良好近似的最佳方法。
import numpy as np
import matplotlib.pyplot as plt

intercept = -5
slope = -4
# y = mx + b

x = []
y = []

for i in range(0, 100):
    x.append(i/300)
    y.append((i * slope + intercept)/300)

n = len(x)
x = np.array(x)
y = np.array(y)

learning_rate = 0.05
exam_m = 0
exam_b = 0
epochs = 1000

for _ in range(epochs):
    gradient_m = 0
    gradient_b = 0
    for i in range(n):
        gradient_m -= (y[i] - exam_m * x[i] - exam_b) * x[i]
        gradient_b -= (y[i] - exam_m * x[i] - exam_b)

    exam_m = exam_m - (2/n)*learning_rate * gradient_m
    exam_b = exam_b - (2/n)*learning_rate * gradient_b

print('Slope, Intercept: ', exam_m, exam_b)

y_pred = exam_m*x + exam_b
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y_pred, '--', color='black', label='predicted_line')
plt.plot(x, y, '--', color='blue', label='orginal_line')
plt.legend()
plt.show()