Я реализовал пример линейного градиентного спуска и понял формулу, лежащую в основе этого, но почему он никогда не достигает оптимального значения и продолжает увеличивать точность, обновляя последние десятичные точки. Какое определение или термин используется для этой проблемы?
Это связано с формулой градиентного спуска или вероятностным и статистическим расчетом, который никогда не позволяет достичь 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