positive - pow php net
Encuentre una ecuaciĆ³n de "mejor ajuste" (7)
Ha pasado un tiempo desde que estaba en la universidad y sabía cómo calcular una línea de mejor ajuste, pero me parece que necesito hacerlo. Supongamos que tengo un conjunto de puntos, y quiero encontrar la línea que es el mejor de esos puntos.
¿Cuál es la ecuación para determinar la mejor línea de ajuste? ¿Cómo haría eso con PHP?
Aquí hay un artículo 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.
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" del artículo de Wikipedia sobre regresión lineal para saber cómo calcular los coeficientes a
y b
en y = a + bx
conjuntos dados de (x,y)
puntos.
De interés adicional es probablemente cuán bueno es el ajuste de la línea. Para eso, use la correlación de Pearson, aquí en una función de 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;
}
Es posible que desee verificar regresión lineal , o más generalmente, ajuste de curva .
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";
Método de mínimos cuadrados http://en.wikipedia.org/wiki/Least_squares . Este libro 3ª edición de Recetas numéricas: El arte de la computación científica (tapa dura) tiene todo lo que necesita para los algoritmos para implementar Mínimos cuadrados y otras técnicas.
Un enfoque de uso frecuente es minimizar iterativamente la suma de las diferencias cuadradas y entre sus puntos y la función de ajuste.