1 回答

TA贡献1793条经验 获得超6个赞
看起来你的程序应该可以工作。但是,您的学习率可能太小了。请记住,学习率是您减少成本函数的步骤的大小。如果一个学习率太小,它会沿着成本曲线的下移太慢,并且需要很长时间才能达到收敛(需要很大的迭代次数)。但是,如果学习率太大,那么就会出现发散的问题。选择正确的学习率和迭代次数(换句话说,调整超参数)与其说是科学,不如说是一门艺术。你应该尝试不同的学习率。
我创建了自己的数据集和随机生成的数据(其中(m1, m2, m3, b) = (10, 5, 4, 2))并运行了您的代码:
import pandas as pd
import numpy as np
x1 = np.random.rand(100,1)
x2 = np.random.rand(100,1)
x3 = np.random.rand(100,1)
y = 2 + 10 * x1 + 5 * x2 + 4 * x3 + 2 * np.random.randn(100,1)
df = pd.DataFrame(np.c_[y,x1,x2,x3],columns=['y','x1','x2','x3'])
#df.head()
# y x1 x2 x3
# 0 11.970573 0.785165 0.012989 0.634274
# 1 19.980349 0.919672 0.971063 0.752341
# 2 2.884538 0.170164 0.991058 0.003270
# 3 8.437686 0.474261 0.326746 0.653011
# 4 14.026173 0.509091 0.921010 0.375524
以 的学习率运行您的算法会0.0000001产生以下结果:
(m1, m2, m3, b) = (0.001, 0.001, 0.001, 0.002)
以 的学习率运行您的算法会.1产生以下结果:
(m1, m2, m3, b) = (9.382, 4.841, 4.117, 2.485)
请注意,当学习率为 时0.0000001,您的系数与它们开始时的 ( 0)没有太大区别。就像我之前说的,小学习率使它成为这样,所以我们以太小的速率改变系数,因为我们以超小步长向下移动成本函数。
我添加了一张图片来帮助可视化选择步长。请注意,第一张图片使用了较小的学习率,第二张图片使用了较大的学习率。
小学习率:
大学习率:
添加回答
举报