Problème en régression linéaire
Bonjour !
J'ai commencé à m'interesser au machine learning il y a quelques semaines avant de me mettre à en coder. Cependant, j'ai un petit problème : lorsque je donne des tailles de dataset trop grandes ou bien un trop gros nombre de répétitions lors d'un entrainement (en appelant la fonction gradient) le compilateur me renvoie la valeur "nan". J'ai cherché dans tous les recoins de mon code, recodé celui-ci en python mais en vain..
Je fais donc appelle à vous pour m'aider à trouver une solution à mon problème.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#include <iostream>
#include <vector>
#include <stdlib.h>
//dataset
std::vector<double> inputs(100);
std::vector<double> outputs(100);
double a = 0;
double b = 0;
double alpha = 0.01;
//fonction feedForward
double feedForward(double x)
{
return a*x+b;
}
//Fonction coût
double error(std::vector<double> _inputs, std::vector<double> _outputs)
{
double sum;
double m = _inputs.size();
for(size_t i = 0; i < m; i++)
{
sum += (feedForward(_inputs[i])-_outputs[i])*(feedForward(_inputs[i])-_outputs[i]);
}
return (1/(2*m))*sum;
}
//dérivée partielle de l'erreur par rapport à a
double dja(std::vector<double> _inputs, std::vector<double> _outputs)
{
double sum;
double m = _inputs.size();
for(size_t i = 0; i < m; i++)
{
sum += inputs[i]*(a*inputs[i]+b-outputs[i]);
}
return (1/m)*sum;
}
//dérivée partielle de l'erreur par rapport à b
double djb(std::vector<double> _inputs, std::vector<double> _outputs)
{
double sum;
double m = _inputs.size();
for(size_t i = 0; i < m; i++)
{
sum += (a*inputs[i]+b-outputs[i]);
}
return (1/m)*sum;
}
//algorithme de descente de gradient
void gradient(std::vector<double> _inputs, std::vector<double> _outputs)
{
a = a - alpha*dja(_inputs, _outputs);
b = b - alpha*djb(_inputs, _outputs);
}
int main()
{
srand(time(0));
//valeur aléatoire pour a et b
a = rand()/(0.01*RAND_MAX);
b = rand()/(0.01*RAND_MAX);
//remplissage du tableau
for(size_t i = 0; i < inputs.size(); i++)
{
inputs[i] = i;
outputs[i] = 3754.54*i+854;
}
//affichage des résultats
//appel de la fonction gradient
for(size_t i = 0; i < 10000; i++)
{
gradient(inputs, outputs);
std::cout << "error : " << error(inputs, outputs) << std::endl;
std::cout << "a : " << a << std::endl;
std::cout << "b : " << b << std::endl;
std::cout << std::endl;
}
} |
Voici la réponse du compilateur :
Code:
1 2 3 4 5
|
error : -nan
a : -nan
b : -nan |
N'hésitez pas nom plus à me donner des astuces pour améliorer mon code !
:)