2008-12-13 72 views
11

自從我上大學以來,我已經有一段時間了,知道如何計算最合適的線,但我發現自己需要。假設我有一組點,並且我想找到那些點中最好的線。找到一個「最合適的」方程

什麼是確定最佳擬合線的公式? 我該怎麼用PHP來做?

回答

2

額外的興趣可能是一個合適的線是多好。 爲此,使用Pearson相關,在這裏一個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

順便說一句,皮爾遜係數範圍從0(無相關性)到1.0(點位於一條直線上) – ruquay 2008-12-13 00:46:46

0

一個常用的方法是迭代地最小化點和擬合函數之間的平方y-差的總和。

4

雖然您可以使用迭代方法,但您可以使用最小二乘方法直接計算給定一組觀測值的線的斜率和截距。有關如何計算ab中的y = a + bx給定組的(x,y)點的the Wikipedia article on linear regression的「單變量線性案例」部分。

6

這裏有一個article比較兩種方法來適應數據的一條線。有一點需要注意的是,有一個直接的解決方案,理論上是正確的,但可能有數字問題。文章說明了爲什麼該方法會失敗,並給出另一種更好的方法。

+1

+1這是迄今爲止最好的答案,另一種方法是遠比不上,雖然更受歡迎。 – Muhd 2011-06-08 18:02:02

2

從維基頁面實施,未經測試。

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