Courbes tendance , régression linéaire

Soyez le premier à donner votre avis sur cette source.

Vue 33 632 fois - Téléchargée 500 fois

Description

But: Fournir un objet assez complet permettant d'opérer facilement une régression
linéaire, plus connu sur le nom de courbe de tendance sous Excel.
Bases: Wikipédia et son cours de régression linéaire
Usage: 0- Dans votre fichier PHP insérer include ("CrbTendance.php");
1- Déclarer l'objet RegLin
ex: $oReg= new RegLin($tDonnees) ou $oReg= new RegLin($tY, $tX)
Les deux syntaxe sont disponible, si une seul tableau est fourni
alors le second est initialisé du même nombre d'occurence commençant à 0
avec un pas de 1
2- Lancer le calcul, avec méthodes fournie de 0 à 4, par défaut 0 sera pris. Pour
tout élément supérieur à 4, la cinquième sera prise.
Cette méthode retourne un tableau à Trois positions,
-avec dans la case "A" le coef directeur de la droite,
-dans la case "B" le positionnement vertical
-dans la case "Cor" le coef de corrélation
-et dans la case "Meth" le numéro de la méthode utlisée

Ex: print_r($oReg0->OptMV(0));
==>Array ( [A] => -649.029426204
[B] => 3037796.68186
[Cor] => -0.143065138366
[Meth] => 0 )
3- De manière optionnel vous pouvez lancer la méthode GetOpt();,
qui vous fournira le point de votre droite en fonction de votre
tableau d'abscisses, si ce dernier n'est pas fourni
vous aurez un tableau de 0 à nb-1 d'occurence du premier tableau

Ex: print_r($oReg1->GetOpt());
==>Array ( [1] => 3037147.65243
[7] => 3033253.47587
[20] => 3024816.09333
[21] => 3024167.06391
[22] => 3023518.03448)

Source / Exemple :

<?php
//	CrbTendance.php
class RegLin{
 /*
  Auteur: 	MILCENT Abel
  Date:		09/21/06
  But: 		Fournir un objet assez complet permettant d'opérer facilement une régression 
  			linéaire, plus connu sur le nom de courbe de tendance sous Excel.
  Bases:	Wikipédia et son cours de régression linéaire	
  Usage:	0- Dans votre fichier PHP insérer include ("CrbTendance.php");
  			1- Déclarer l'objet RegLin 
			  ex: $oReg= new RegLin($tDonnees) ou $oReg= new RegLin($tY, $tX)
			  Les deux syntaxe sont disponible, si une seul tableau est fourni 
			  alors le second est initialisé du même nombre d'occurence commençant à 0 
			  avec un pas de 1 
			2- Lancer le calcul, avec méthodes fournie de 0 à 4, par défaut 0 sera pris. Pour 
			   tout élément supérieur à 4, la cinquième sera prise.
			   Cette méthode retourne un tableau à Trois positions, 
			    -avec dans la case "A" le coef directeur de la droite, 
			    -dans la case "B" le positionnement vertical 
			    -dans la case "Cor" le coef de corrélation
			    -et dans la case "Meth" le numéro de la méthode utlisée
			    
			    Ex: print_r($oReg0->OptMV(0));
			    ==>Array ( 	[A] => -649.029426204 
							[B] => 3037796.68186 
							[Cor] => -0.143065138366 
							[Meth] => 0 ) 
			3- De manière optionnel vous pouvez lancer la méthode GetOpt();, 
				qui vous fournira le point de votre droite en fonction de votre 
				tableau d'abscisses, si ce dernier n'est pas fourni 
				vous aurez un tableau de 0 à nb-1 d'occurence du premier tableau
				
				Ex: print_r($oReg1->GetOpt());
				==>Array ( 	[1] => 3037147.65243 
							[7] => 3033253.47587 
							[20] => 3024816.09333 
							[21] => 3024167.06391 
							[22] => 3023518.03448)

			     
 */
 
 //champ de l'objet
 private $tDonnees;
 private $tAbscisse;
 private $vNbElt;	//Nombre déléments des tableaux
 
 private $vMoyX;		//Moyenne des X
 private $vMoyY;		//Moyenne des Y
 private $vSumXY;
 private $vSumX;
 private $vSumY;
 private $vSumX2;
 private $tPtG;		//Le point moyen G est un tableau tPtG(X,Y)=(vMoyX,vMoyY)
 //La variance, c'est la moyenne des carrés soustrait du carré de la moyenne
 Private $vVarianceX;	
 Private $vVarianceY; 
 //L'écart Type, c'est la racine carrée de la variance
 Private $vEcartTX;	
 Private $vEcartTY;  
 //La covariance, la moyenne des produits moins le produit des moyennes
 Private $vCovariance;
 
 
 Private $vA;			//Coef directeur de la droite liée à la régression
 Private $vB;			//Coef B de la droite liée à la régression
 Private $vCoefCorLin;//Coef de corrélation linéaire
 
 
 // constructeur
 function __construct($tDataY,$tDataX="") {
  $this->tDonnees = $tDataY;
  $this->tAbscisse = $tDataX;
  $p=0;
  if($tDataX=="")
  {$p=1;}
  
  $this->init($p);
 }


 //Méthodes privée de l'objet 
 Private function init($x=0)
 {
	//initialise les Variables pour les calculs
  $this->vNbElt= $n=	count($this->tDonnees); // Nombres d'éléments

	//Mise en place des abscisses
	if($x==1)
	{
	 	for($i=0;$i<$n;$i++){
			$this->tAbscisse[$i]=$i;
		}
	}
	
	//parcours des donnees pour récupération formule nécessaire au calcul des éléments
	$sumX=0; //somme des X
	$sumY=0; //somme des Y
	$sumX2=0; //somme des X²
	$sumY2=0; //somme des y²
	$sumXY=0; //somme des x*y

	for($i=0;$i<$n;$i++)	
	{
	  $xVal=$this->tAbscisse[$i];
	  $yVal=$this->tDonnees[$i];
	  
	  $sumX+=$xVal;
	  $sumY+=$yVal;
	  $sumX2+=$xVal*$xVal;
	  //correction du 20080903 remplace  $sumY2+=$yVal=$yVal; par $sumY2+=$yVal*$yVal;
	  $sumY2+=$yVal*$yVal; 
	  $sumXY+=$xVal*$yVal;

	}
	
	
	
	
	
	$this->vMoyX=$sumX/$n; //moyenne X
	$this->vMoyY=$sumY/$n; //moyenne Y
	
	$this->vSumXY=$sumXY;
	$this->vSumX=$sumX;
	$this->vSumY=$sumY;
	$this->vSumX2=$sumX2;

	$this->tPtG=array("X"=>$this->vMoyX,"Y"=>$this->vMoyY); //point moyen G
	//La variance, c'est la moyenne des carrés soustrait du carré de la moyenne: Rappel
	
	$this->vVarianceX=($sumX2/$n)-($this->vMoyX*$this->vMoyX);	
	$this->vVarianceY=($sumY2/$n)-($this->vMoyY*$this->vMoyY);

	
	
	//L'écart Type, c'est la racine carrée de la variance: Rappel
 	$this->vEcartTX=sqrt(abs($this->vVarianceX));	
 	$this->vEcartTY=sqrt(abs($this->vVarianceY));  
	 //La covariance, la moyenne des produits moins le produit des moyennes
 	$this->vCovariance=($sumXY/$n)-($this->vMoyX*$this->vMoyY);
	
	$tTest=array(
	$this->vMoyX,
	$this->vMoyY,
	$this->tPtG,
	$this->vVarianceX,
	$this->vVarianceY,
 	$this->vEcartTX,	
 	$this->vEcartTY,
 	$this->vCovariance);
 }
 //Calcul de la droite
 Private function CoefsDroite($met=0)
 {
	//Calcul de coef directeur de la régression
	//par théorie de la régression linéaire le coef a est obtenu des manières suivantes avec 	
	// 5 variantes  disponibles
	switch ($i) {
	case 0:
  	 $this->vA=$this->vCovariance/$this->vVarianceX;
  	 break;
  	case 1:
	 $this->vA=$this->vVarianceY/$this->vCovariance;
  	 break;  
 	case 2:
	 $this->vA=($this->vCovariance*$this->vEcartTY)/(abs($this->vCovariance)*$this->vEcartTX);
  	 break; 
	     
	case 3:
	 $this->vA=($this->vVarianceY-$this->vVarianceX+SQRT(pow(($this->vVarianceY-$this->vVarianceX),2)+pow((2*$this->vCovariance)),2))/(2*$this->vCovariance);
  	 break; 
  	case 4:
	 $this->vA=($this->vSumXY-(($this->vSumX*$this->vSumY)/$this->vNbElt)/($this->vSumX2-(pow($this->vSumX,2)/$this->vNbElt)));
  	 break; 
	   }
	$this->vB=$this->vMoyY-($this->vA*$this->vMoyX);
}

 Private function CoefCorLin()
 {
	//Calcul de coef de coorélation linéaire
	//ce  coef a est obtenu de la manière suivante
	//Covariance que divise l'écart Type X multiplié par l'écart Type de Y
	$this->vCoefCorLin=$this->vCovariance/($this->vEcartTX*$this->vEcartTY);
}


 //Méthodes publiques de l'objet
 function OptMV($meth=0){
	//Effectue la régression Linéaire
	$this->CoefsDroite($meth);
	$this->CoefCorLin();
	return array("A"=>$this->vA,"B"=>$this->vB,"Cor"=>$this->vCoefCorLin,"Meth"=>$meth);
 }
function GetOpt(){
	//renvoi le tableau des points optimisés
	$tOpt="";
//	for($i=0;$i<$this->vNbElt;$i++)
	foreach($this->tAbscisse as $i)
	{
		$tOpt[$i]=$this->vA*$i+$this->vB;
	}
	return $tOpt;
}
	
	
	
}


//zone Test et exemple d'utilisation
/*
$y=array(50,75,76,80,50,180,17,72,200,56,22,85,100,90,80,110,70,110,105,89);
$x=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
$y2=array(1,4,9,16,25,36,49,64,81,100);
$y3=array(150,2,1000,60,1000000,3,8,557,45623125,455,987,1564231,12,56,78963,52,6,8956321,8956,5);
$x3=array(1,7,20,21,22,40,100,101,180,181,182,185,186,189,200,201,202,203,204,3000);

$oReg0= new RegLin($y3,$x3);
print("<hr>Meth 0: <br>");
print_r($oReg0->OptMV(0));

$oReg1= new RegLin($y3,$x3);
print("<hr>Meth 1: <br>");
print_r($oReg1->OptMV(1));

$oReg2= new RegLin($y3,$x3);
print("<hr>Meth 2: <br>");
print_r($oReg2->OptMV(2));

$oReg3= new RegLin($y3,$x3);
print("<hr>Meth 3: <br>");
print_r($oReg3->OptMV(3));

$oReg4= new RegLin($y3,$x3);
print("<hr>Meth 4: <br>");
print_r($oReg4->OptMV(4));

print_r($oReg1->GetOpt());
*/
?>

Conclusion :

Il doit y avoir quelques petits bugs que vous vous ferez un plaisir de corriger.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Bug apparu sous php7.2 :

Dans la fonction GetOpt() (ligne 193) il ne faut pas initialiser $tOpt = "" (string) mais en tant que tableau : $tOpt = array(); (ou écriture raccourcie []).
RaftY
Messages postés
57
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010
-
Pas de quoi pour les réponses, je suis un peu au calme ajr.

Mais pour compléter, j'ai trouver ceci toujours écrit en VB, CAML et PHP. Très impressionnant, seulement tu ne règles pas le degré de la courbe. mais fonctionne super bien

http://www.codyx.org/snippet_interpolation-polynomiale_549.aspx

Pour en revenir au langage de prog, chacun a ces habitudes et chaque langage a ces propres facilités et domaine d'activité privilégié. On ne refera pas le monde, mais n'oublions jamais, que la plupart des nouveau langage s'appuie sur des sources C, des OS écrit en C voir en ASM. Ne pas oublié les bases.

Ensuite, pourquoi pas intégrer dans le lib standard du PHP, car vraisemblablement PHP est peu utiliser pour faire ceci. Je pense que lib PECL comme pear, se contruisent des outils simples pour l'instant qui sont beaucoup utilisés. De plus, les connaissances mathématiques nécessaire à ce genre de prog ne sont pas anodine, et que les mathématiciens préfèrent des langage comme CAML ou mathlab pour exprimer leur bib, plutot que PHP qui reste un très bon langage, mais usage quasi exclusif pour le WEB. Il est passé depuis peu comme un langage important. Il faut laisser le temps à la communauté de s'habituer et d'œuvrer vers son nouveau status.

A plus
madvic
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
9 juin 2018
-
Merci bcp pour ton travail et ta réponse.

Mais pq autant de langage de programmation ? Autant tous mettre en php (ca m'arrange ;-) )
Je trouve tout de même étrange que ces fonction ne soit pas intégré dans les bibliothèque des langages de prog.
Enfin, ca viendra...
madvic
Messages postés
21
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
9 juin 2018
-
Bonjour,

Y'a t-il un moyen de resortir l'equation de la droite obtenue ?
Et est ce difficile de faire la même chose pour une courbe ?
merci
RaftY
Messages postés
57
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010
-
Merci MYMY1592 pour la découverte du bug, correction faite.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.