2008-12-13 16 views
11

Ha pasado un tiempo desde que estaba en la universidad y sabía cómo calcular una línea que mejor se ajusta, pero me parece necesario. Supongamos que tengo un conjunto de puntos, y quiero encontrar la línea que es el mejor de esos puntos.Encuentra la ecuación "mejor ajustada"

¿Cuál es la ecuación para determinar una mejor línea de ajuste? ¿Cómo haré eso con PHP?

Respuesta

2

De interés adicional es probable que tan buena sea la línea. Para ello, utiliza la correlación de Pearson, aquí en una función 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

Por cierto, el coeficiente de Pearson varía de 0 (sin correlación) a 1.0 (los puntos se encuentran en una línea recta) – ruquay

0

Un enfoque de uso frecuente consiste en minimizar iterativamente la suma de las diferencias cuadradas y entre sus puntos y la función de ajuste.

4

Aunque puede utilizar un enfoque iterativo, puede calcular directamente la pendiente y la intersección de una línea dado un conjunto de observaciones utilizando un enfoque de mínimos cuadrados. Consulte la sección "Caso lineal univariante" de the Wikipedia article on linear regression para saber cómo calcular los coeficientes a y b en y = a + bx conjuntos de puntos dados de (x,y).

6

Aquí hay un article que compara dos formas de ajustar una línea a los datos. Una cosa a tener en cuenta es que hay una solución directa que es correcta en teoría pero que puede tener problemas numéricos. El artículo muestra por qué ese método puede fallar y proporciona otro método que es mejor.

+1

+1 Esto, con mucho, la mejor respuesta, el otro método es muy inferior, aunque más popular. – Muhd

2

Implementado desde la página wiki, no probado.

$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"; 
Cuestiones relacionadas