我上大学已经有一段时间知道如何计算出最合适的线条,但我发现自己需要。假设我有一组点,我想找到那些点中最好的那条线。
确定最佳拟合线的公式是什么? 我怎么用PHP做到这一点?
答案 0 :(得分:6)
这是article比较两种方法来匹配数据线。需要注意的一点是,理论上有一个直接的解决方案,但可能存在数值问题。文章说明了为什么该方法可能失败并提供另一种更好的方法。
答案 1 :(得分:5)
最小二乘法 http://en.wikipedia.org/wiki/Least_squares。 这本书Numerical Recipes 3rd Edition: The Art of Scientific Computing (Hardcover) 拥有实现最小二乘法和其他技术的算法所需的一切。
答案 2 :(得分:4)
虽然您可以使用迭代方法,但您可以使用最小二乘法直接计算给定一组观测值的线的斜率和截距。请参阅the Wikipedia article on linear regression的“单变量线性案例”部分,了解如何计算a
个b
个y = a + bx
点集合中的系数(x,y)
和{{1}}。
答案 3 :(得分:2)
您可能需要查看linear regression,或更一般地说,curve fitting。
答案 4 :(得分: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";
答案 5 :(得分:2)
额外的兴趣可能是这条线的合适程度。 为此,在PHP函数中使用Pearson相关:
/**
* 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;
}
答案 6 :(得分:0)
一种常用的方法是迭代地最小化点与拟合函数之间的y差的平方和。
答案 7 :(得分:0)
要添加到FryGuy的答案中,如果您需要一个还给出R ^ 2(以显示拟合程度如何)的函数:
'left \x1b[41m\x1b[37mfoot\x1b[0m right \x1b[41m\x1b[37mfoot\x1b[0m left \x1b[41m\x1b[37mfoot\x1b[0m right. \x1b[41m\x1b[37mfeet\x1b[0m in the day, \x1b[41m\x1b[37mfeet\x1b[0m at night.'