【发布时间】:2020-02-29 00:25:37
【问题描述】:
我已经实现了一个线性梯度下降示例并理解了它背后的公式,但为什么它永远不会达到最佳值并通过更新后面的小数点来不断提高准确性。这个问题的定义或术语是什么?
这是由于梯度下降的公式还是概率和统计计算从未让它达到 100% 并输出 99.99%?
这是 Node.js 上线性梯度下降的代码
const computeCost = require('./computeCost');
console.time('gradientDescent');
const gradientDescent = (X, y, thetat, alpha, iterations, levels) => {
const m = y.length;
var theta = thetat;
var jHistory = [Infinity];
var thetaHistory = [];
var limit = 0;
var cc = 0;
for (var i = 1; i < iterations; i++) {
var theta0 = theta[0];
var theta1 = theta[1];
const hThetaY = X.map((val,i) => {
const hTheta = theta[0] + theta[1]*val;
return hTheta-y[i];
});
const sum0 = hThetaY.reduce((a, b) => a + b);
theta0 = theta0 - (alpha/m) * sum0;
var sum1 = 0;
hThetaY.forEach((val,i) => {
sum1 += val*X[i];
});
theta1 = theta1 - (alpha/m) * sum1;
cc++;
var J = computeCost(X, y, [theta0, theta1]);
jHistory.push(J);
theta = [theta0, theta1];
thetaHistory.push(...theta);
if (J === 0 || Math.abs(J - jHistory[i-1]) < Number(`1e-${levels}`)) {
console.log('CC:', cc);
console.log('-------------------',{iterations: i});
jHistory.shift();
return {theta, jHistory, thetaHistory};
}
}
console.log('CC:', cc);
jHistory.shift();
return {jHistory, theta, thetaHistory};
};
console.timeEnd('gradientDescent');
module.exports = gradientDescent;
根据数据:
var X = [1, 2, 3, 4, 5], y = [1, 3, 5, 7, 9];
任何人都能理解的线是2x-1
例如:
Theta0 的值不断更新为:
0.26833333333333337,
1.794529145018259,
1.8698473883049052,
1.9175566659682246,
1.9476819685001623
实际值应该达到 2,但它永远不会。
示意图如下: Theta0 History Graph
【问题讨论】:
-
您能否发布您的代码以更好地了解您所做的事情。还有你的梯度下降增加了吗?
-
@thilakshiK 更新了问题,请看你能不能回答。
-
如果您尝试将
theta0和theta1值设置为2x - 1中的确切值,那么您最终会将成本值设为零。 J = 0 并不意味着您的成本函数工作正常。这意味着您的训练数据完全适合您的模型,但这并不意味着您的测试集也将完全适合。我希望你知道模型过度拟合。您可以增加迭代次数以使值接近 2。 -
@thilakshiK - 这就是我想要做的 J = 0,这反过来又以 100% 的准确度预测未来的样本,而不是 1.99x - 0.99 的值,当给定更高的值输入 10000 时预测,误差会很大。这是我的问题,为什么它没有达到最佳值 2。经过一百万次迭代后,它仍然没有达到这个值,所以这个问题的定义或术语是什么,我只是问这个问题。
标签: node.js machine-learning linear-gradients gradient-descent supervised-learning