Важно: я новичок в ML и хочу самостоятельно реализовать алгоритмы, которые изучаю, без использования библиотек ML.
У меня есть набор данных с ценой (y) дляколичество км (х), и я хочу найти функцию, которая описывает данные.Вы можете найти набор данных и весь код здесь: https://wetransfer.com/downloads/034d9918f6d29268f06be45d76e156f420190330174420/6af73b
Я использую классический алгоритм градиентного спуска: мой код работает и хорошо сходится для некоторых одиночных задач линейной регрессии, но не тот, который меня интересует.
/* Classic gradient descent algorithm */
ft_sum(double *x, double *y, long double theta0, long double theta1, int epoch, int truth)
{
long double result = 0.00;
long double tmp;
int i;
i = 0;
while (epoch--)
{
/* Derivative part of the gradient descent */
tmp = ((x[i] * theta1 + theta0)) - (y[i]);
if (truth == 1)
tmp = tmp * (x[i]);
result += tmp;
i++;
}
return (result);
}
/* Linear regression */
void single_linear_regression(double *x, double *y, double epoch, char *argv)
{
long double theta0 = 0; /* bias */
long double theta1 = 0; /* weight */
long double error = 100; /* Cost of the function */
long double tmp1;
long double tmp2;
double alpha = 0.0000000001; /* with higher learning rate it does not converge */
int i = 0;
while (!(error > -0.4 && error < 0.4)) // it doesn't go below 0.4
{
tmp1 = theta0 - ((alpha * (1.00 / epoch) *
(error = ft_sum(x, y, theta0, theta1, epoch - 1, 0))));
tmp2 = theta1 - ((alpha * (1.00 / epoch) *
(error = ft_sum(x, y, theta0, theta1, epoch - 1, 1))));
theta0 = tmp1;
theta1 = tmp2;
printf("error := %Lf\n", error);
}
printf("error := %Lf | theta0 == %Lf | theta1 == %Lf\n", error, theta0, theta1);
}
В конце у меня есть:
Ошибка: = 0,240723 |theta0 == 0.000004 |theta1 == 0,044168
(f (x) = 0,044x + 0,000004) Когда фактическая функция равна: -0,02x + 8500 ...
Я уже пытался нормализовать данные [0-1], меняя начальные значения веса и смещения, и я действительно застрял на этом.