2010-12-30 8 views
2

J'ai la fonction PHP suivante que j'utilise pour dessiner une ligne de tendance. Cependant, il trace parfois la ligne en dessous de tous les points du diagramme de dispersion. Y at-il une erreur dans ma fonction ou existe-t-il une meilleure façon de le faire. Je pense que cela pourrait être quelque chose à voir avec la ligne qu'il produit, il traite tous les résidus (les distances entre les points de dispersion et la ligne) comme positifs, qu'ils soient au-dessus ou en dessous de la ligne.Comment améliorer cette fonction de régression linéaire?

function linear_regression($x, $y) { 

$n = count($x); 

$x_sum = array_sum($x); $y_sum = array_sum($y); 

$xx_sum = 0; $xy_sum = 0; 

for($i = 0; $i < $n; $i++) { $xy_sum+=($x[$i]*$y[$i]); $xx_sum+=($x[$i]*$x[$i]); } 

$m = (($n * $xy_sum) - ($x_sum * $y_sum))/(($n * $xx_sum) - ($x_sum * $x_sum)); $b = ($y_sum - ($m * $x_sum))/$n; return array("m"=>$m, "b"=>$b); 

} 

Répondre

1

Je ne vois pas un problème direct avec votre fonction, mais si elle produit mal-résultats à la recherche que parfois, peut-être que vous avez des problèmes de débordement. La formule que vous utilisez n'est pas robuste en termes de calcul. L'article simple linear regression sur Wikipédia donne une formule différente (juste en face de la formule que vous utilisez) - celle-ci est moins susceptible d'avoir des débordements.

+0

Il se trouve que je commençais juste mes valeurs x de 1 plutôt que 0 .... – user558383

3

Ceci est une bonne fonction créée par Richard @ Home

/** 
* linear regression function 
* @param $x array x-coords 
* @param $y array y-coords 
* @returns array() m=>slope, b=>intercept 
*/ 
function linear_regression($x, $y) { 

    // calculate number points 
    $n = count($x); 

    // ensure both arrays of points are the same size 
    if ($n != count($y)) { 
    trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR); 
    } 

    // calculate sums 
    $x_sum = array_sum($x); 
    $y_sum = array_sum($y); 

    $xx_sum = 0; 
    $xy_sum = 0; 

    for($i = 0; $i < $n; $i++) { 
    $xy_sum+=($x[$i]*$y[$i]); 
    $xx_sum+=($x[$i]*$x[$i]); 
    } 

    // calculate slope 
    $m = (($n * $xy_sum) - ($x_sum * $y_sum))/(($n * $xx_sum) - ($x_sum * $x_sum)); 

    // calculate intercept 
    $b = ($y_sum - ($m * $x_sum))/$n; 

    // return result 
    return array("m"=>$m, "b"=>$b); 
} 

Exemple d'utilisation:

var_dump(linear_regression(array(1, 2, 3, 4), array(1.5, 1.6, 2.1, 3.0))); 

https://richardathome.wordpress.com/2006/01/25/a-php-linear-regression-function/

Questions connexes