2008-12-13 36 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";