Régression linéaire par écart de distance

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 14:20

régression linéaire par écart de distance

par sylvain231 » 25 Juin 2020, 13:33

Bonjour,
je cherche à implémenter la régression linéaire par écart de distances de ce papier : https://fr.scribd.com/document/14819165 ... -spherique
Sur ces images je cherche à faire coller une droite sur les points verts :
http://sylvain-ard.fr/temp/regression_l ... euille.jpg
http://sylvain-ard.fr/temp/regression_l ... euille.jpg
Vous pouvez voir les droites calculées en rouge.
L'image de départ est :
http://sylvain-ard.fr/temp/regression_l ... /IMAGE.jpg
Les listes de points sont :
http://sylvain-ard.fr/temp/regression_l ... droite.csv
http://sylvain-ard.fr/temp/regression_l ... gauche.csv
et mon code est :
Code: Tout sélectionner
double moyX = 0;
   for (int i = 0; i < points.size(); i++) {
      moyX += points[i].x;
   }
   moyX /= points.size();
   double sommeA=0;
   for (int i = 0; i < points.size(); i++) {
      sommeA+=points[i].y*points[i].y;
   }
   double sommeB=0;
   for (int i = 0; i < points.size(); i++) {
      sommeB+=points[i].y;
   }
   double sommeC=0;
   for (int i = 0; i < points.size(); i++) {
      sommeC+=points[i].x*points[i].x;
   }
   double sommeD=0;
   for (int i = 0; i < points.size(); i++) {
      sommeD+=points[i].x;
   }
   double sommeE=0;
   for (int i = 0; i < points.size(); i++) {
      sommeE+=points[i].x*points[i].y;
   }
   double numerateur=0.5*(points.size()*sommeA-sommeB*sommeB-points.size()*sommeC+
   sommeD*sommeD);
   double denominateur=points.size()*sommeE-sommeB*sommeD;
   
   if (denominateur == 0)
   {
      this->vertical = true;
      this->x = moyX;
   }
   else
   {
      double c = numerateur / denominateur;
      this->slope = c+sqrt(c*c+1);
      this->originOrdinate = (1/points.size())*(sommeB-(this->slope)*sommeD);
      this->vertical = false;
   }


SVP aidez-moi à voir ce qui ne va pas
Merci
Bien cordialement



sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 14:20

Re: régression linéaire par écart de distance

par sylvain231 » 25 Juin 2020, 15:00

Rebonjour,
finalement j'ai trouvé tout seul je pense que la formule du papier n'est pas bonne. J'ai pris la formule de la régression orthogonale sur wikipédia et ça marche !
Voici mon code :
Code: Tout sélectionner
Straight::Straight(vector<Point> points) {
   double moyX = 0;
   double moyY = 0;
   for (int i = 0; i < points.size(); i++) {
      moyX += points[i].x;
      moyY += points[i].y;
   }
   moyX /= points.size();
   moyY /= points.size();
   double sommeA=0;
   for (int i = 0; i < points.size(); i++) {
      sommeA+=(points[i].x-moyX)*(points[i].x-moyX);
   }
   double sommeB=0;
   for (int i = 0; i < points.size(); i++) {
      sommeB+=(points[i].y-moyY)*(points[i].y-moyY);
   }
   double sommeC=0;
   for (int i = 0; i < points.size(); i++) {
      sommeC+=(points[i].x-moyX)*(points[i].y-moyY);
   }
   double erreur = 0;
   cout << "sommeC = " << sommeC << endl;
   if (sommeC == 0)
   {
      cout << "vertical" << endl;
      this->vertical = true;
      this->x = moyX;
      for (int i = 0; i < points.size(); i++) {
         erreur += this->getDistance(points[i]);
      }
   }
   else
   {
      double C=0.5*(sommeA-sommeB)/(2*sommeC);
      this->slope=-C+sqrt(C*C+1);
      this->originOrdinate=moyY-this->slope*moyX;
      double erreur1 = 0;
      for (int i = 0; i < points.size(); i++) {
         erreur1 += this->getDistance(points[i]);
      }
      this->slope = -C - sqrt(C*C + 1);
      this->originOrdinate = moyY - this->slope*moyX;
      double erreur2 = 0;
      for (int i = 0; i < points.size(); i++) {
         erreur2 += this->getDistance(points[i]);
      }
      if (erreur1 > erreur2) {
         erreur = erreur2;
         this->slope = -C - sqrt(C*C + 1);
      }
      else
      {
         erreur = erreur2;
         this->slope = -C+ sqrt(C*C + 1);
      }
      this->originOrdinate = moyY - this->slope*moyX;
      this->vertical = false;
   }
   
   this->error=erreur/points.size();
}

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 22 invités

cron

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite