2008-12-13 8 views
11

Ça fait longtemps que je n'étais pas à l'université et je savais calculer la ligne la mieux adaptée, mais je me suis senti obligé de le faire. Supposons que j'ai un ensemble de points, et je veux trouver la ligne qui est le meilleur de ces points.Trouver une équation "best fit"

Quelle est l'équation pour déterminer la meilleure ligne? Comment ferais-je ça avec PHP?

Répondre

2

Un autre intérêt est probablement la qualité de l'ajustement de la ligne. Pour cela, utilisez la corrélation de Pearson, ici dans une fonction PHP:

/** 
* returns the pearson correlation coefficient (least squares best fit line) 
* 
* @param array $x array of all x vals 
* @param array $y array of all y vals 
*/ 

function pearson(array $x, array $y) 
{ 
    // number of values 
    $n = count($x); 
    $keys = array_keys(array_intersect_key($x, $y)); 

    // get all needed values as we step through the common keys 
    $x_sum = 0; 
    $y_sum = 0; 
    $x_sum_sq = 0; 
    $y_sum_sq = 0; 
    $prod_sum = 0; 
    foreach($keys as $k) 
    { 
     $x_sum += $x[$k]; 
     $y_sum += $y[$k]; 
     $x_sum_sq += pow($x[$k], 2); 
     $y_sum_sq += pow($y[$k], 2); 
     $prod_sum += $x[$k] * $y[$k]; 
    } 

    $numerator = $prod_sum - ($x_sum * $y_sum/$n); 
    $denominator = sqrt(($x_sum_sq - pow($x_sum, 2)/$n) * ($y_sum_sq - pow($y_sum, 2)/$n)); 

    return $denominator == 0 ? 0 : $numerator/$denominator; 
} 
+0

btw, le coefficient de Pearson varie de 0 (pas de corrélation) à 1,0 (les points se trouvent sur une ligne droite) – ruquay

0

Une approche souvent utilisée consiste à minimiser de manière itérative la somme des différences y au carré entre vos points et la fonction d'ajustement.

4

Bien que vous puissiez utiliser une approche itérative, vous pouvez directement calculer la pente et l'ordonnée à l'origine d'une ligne en fonction d'un ensemble d'observations en utilisant une approche par les moindres carrés. Voir la section "Cas linéaire univarié" de the Wikipedia article on linear regression pour savoir comment calculer les coefficients a et b en y = a + bx donnés ensembles de (x,y) points.

6

Voici un article comparant deux façons d'adapter une ligne aux données. Une chose à surveiller est qu'il existe une solution directe qui est correcte en théorie mais qui peut avoir des problèmes numériques. L'article montre pourquoi cette méthode peut échouer et donne une autre méthode qui est meilleure.

+1

+1 C'est de loin la meilleure réponse, l'autre méthode est largement inférieure, bien plus populaire. – Muhd

2

Implémenté depuis la page wiki, non testé.

$sx = 0; 
$sy = 0; 
$sxy = 0; 
$sx2 = 0; 
$n = count($data); 
foreach ($data as $x => $y) 
{ 
    $sx += $x; 
    $sy += $y; 
    $sxy += $x * $y; 
    $sx2 += $x * $x; 
} 
$beta = ($n*$sxy - $sx*$sy)/($n*$sx2 - $sx*$sx); 
$alpha = $sy/$n - $sx*$beta/$n; 

echo "y = $alpha + $beta x";