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.
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.