Régression Linéaire

Suite à un cours de math je me suis qu'il pourrait être intéressant d'implémenter un algorithme de regression linéaire histoire de mieux s'en rappeler (je suis sur qu'il existe pleins d'autres implémentations bien meilleurs). Celle-ci est volontairement non optimisée pour rester le plus lisible possible
Le code suivant charge un fichier sous la forme : "valX valY" (voir bas de page pour une code exemple). Le résultat peut être vérifié grâce gnuplot qui propose aussi une implémentation de cette algorithme.
#include <stdio.h> #include <assert.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]){ FILE *fData; float x1, x2; double moyenneX = 0, moyenneY = 0; double moyenneX2 = 0; double moyenneXY = 0; double a, b; int count = 0; assert (argc == 2); if ((fData = fopen (argv[1],"r")) == NULL){ goto err; } while (fscanf (fData, "%e %e", &x1, &x2) == 2){ moyenneX += x1; moyenneY += x2; moyenneX2 += x1*x1; moyenneXY += x1*x2; count++; } moyenneX /= count; moyenneY /= count; moyenneX2 /= count; moyenneXY /= count; a = (moyenneXY - moyenneX*moyenneY)/(moyenneX2 - moyenneX*moyenneX); b = moyenneY - a*moyenneX; printf ("a = %e\n", a); printf ("b = %e\n",b); fclose (fData); goto fin; err : fprintf (stderr, "Erreur\n"); fin : return 0; }
Code pour générer un fichier de données exemple :
#include <stdio.h> #include <stdlib.h> #include <assert.h> int main(int argc, char *argv[]){ int m; FILE *fp; assert (argc == 2); if ((fp = fopen (argv[1], "w")) != NULL){ for (int i = 0 ; i < 10000 ; i++){ m = (rand()%2 == 0)?1:-1; fprintf (fp, "%d %d\n", i, i*2+m*rand()%150); } }else{ fprintf (stderr , "Cannot open file %s\n", argv[1]); } return 0; }
Domaine: