我在JavaScript中使用渐变下降实现了我的第一个(单变量)线性回归。
const LEARNING_RATE = 0.000001;
let m = 0;
let b = 0;
const hypothesis = x => m * x + b;
const learn = (alpha) => {
if (x.length <= 0) return;
let sum1 = 0;
let sum2 = 0;
for (var i = 0; i < x.length; i++) {
sum1 += hypothesis(x[i]) - y[i];
sum2 += (hypothesis(x[i]) - y[i]) * x[i];
}
b = b - alpha * sum1 / (x.length);
m = m - alpha * sum2 / (x.length);
}
// repeat until convergence learn(LEARNING_RATE);
假设中m的斜率很快调整,但y轴的交点需要调整年龄。我不得不使用不同的学习率来使其发挥作用。
const learn = (alpha) => {
if (x.length <= 0) return;
let sum1 = 0;
let sum2 = 0;
for (var i = 0; i < x.length; i++) {
sum1 += hypothesis(x[i]) - y[i];
sum2 += (hypothesis(x[i]) - y[i]) * x[i];
}
b = b - 100000 * alpha * sum1 / (x.length);
m = m - alpha * sum2 / (x.length);
}
有人能指出我对算法的错误方向吗?它可以在GitHub repository和this article中找到。
答案 0 :(得分:0)
首先,你必须考虑收敛速度到全局最小值而不是偏见变化的速度。模型中没有错误(也许您只是忘记2 / N系数,但对于m和b系数,此参数将为1。)。
如您所知,梯度下降法使用预测误差来更新每次迭代的权重。因此,如果您的偏见得到小错误,那么更新将获得小的更改。这是模型的正常行为。
There are示例有很好的解释。
PS。学习率的自定义更改可能会导致异常行为和问题,降低到最小值。建议this course。