2008-12-13 7 views
11

Es ist eine Weile her, seit ich auf dem College war und wusste, wie man eine beste Fit Linie berechnet, aber ich finde mich selbst müssen. Angenommen, ich habe eine Menge von Punkten, und ich möchte die Linie finden, die der beste dieser Punkte ist.Finden Sie eine "beste Passform" Gleichung

Was ist die Gleichung, um eine Best-Fit-Linie zu bestimmen? Wie würde ich das mit PHP machen?

Antwort

2

Von zusätzlichem Interesse ist wahrscheinlich, wie gut die Linie passt. Dafür verwenden die Korrelation Pearson, hier in einer PHP-Funktion:

/** 
* 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, der Pearson-Koeffizient reicht von 0 (keine Korrelation) bis 1,0 (Punkte liegen auf einer geraden Linie) – ruquay

0

Ein häufig verwendeter Ansatz besteht darin, die Summe der quadrierten y-Differenzen zwischen Ihren Punkten und der Fit-Funktion iterativ zu minimieren.

4

Obwohl Sie einen iterativen Ansatz verwenden können, können Sie die Steigung und den Achsenabschnitt einer Linie anhand einer Reihe von Beobachtungen mithilfe eines Ansatzes der kleinsten Quadrate direkt berechnen. Im Abschnitt "Univariate Linear Case" von the Wikipedia article on linear regression erfahren Sie, wie Sie die Koeffizienten a und b in y = a + bx gegebenen Mengen von (x,y) Punkten berechnen.

6

Hier ist ein article Vergleichen zweier Möglichkeiten, um eine Zeile an Daten anzupassen. Eine Sache, auf die man achten sollte, ist, dass es eine direkte Lösung gibt, die in der Theorie korrekt ist, aber numerische Probleme haben kann. Der Artikel zeigt, warum diese Methode fehlschlagen kann und gibt eine andere Methode, die besser ist.

+1

+1 Dies ist bei weitem die beste Antwort, die andere Methode erheblich schlechter ist, wenn auch immer beliebter. – Muhd

2

Implementiert von Wiki-Seite, ungetestet.

$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"; 
Verwandte Themen