0/5 (8 avis)
Vue 35 490 fois - Téléchargée 528 fois
<?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()); */ ?>
30 avril 2019 à 15:15
Dans la fonction GetOpt() (ligne 193) il ne faut pas initialiser $tOpt = "" (string) mais en tant que tableau : $tOpt = array(); (ou écriture raccourcie []).
14 oct. 2008 à 18:48
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
14 oct. 2008 à 14:06
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...
13 oct. 2008 à 14:46
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
3 sept. 2008 à 10:04
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.