我有以下用于绘制趋势线的PHP函数。但是,它有时会在散点图中的所有点下方绘制线条。我的功能是否有错误或是否有更好的方法。我认为它可能与它产生的线有关,它将所有残差(从散点到线的距离)视为正,无论它们在线的上方还是下方。
function linear_regression($x, $y) {
$n = count($x);
$x_sum = array_sum($x); $y_sum = array_sum($y);
$xx_sum = 0; $xy_sum = 0;
for($i = 0; $i < $n; $i++) { $xy_sum+=($x[$i]*$y[$i]); $xx_sum+=($x[$i]*$x[$i]); }
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum)); $b = ($y_sum - ($m * $x_sum)) / $n; return array("m"=>$m, "b"=>$b);
}
答案 0 :(得分:2)
这是Richard @ Home
创建的一个很好的功能/**
* linear regression function
* @param $x array x-coords
* @param $y array y-coords
* @returns array() m=>slope, b=>intercept
*/
function linear_regression($x, $y) {
// calculate number points
$n = count($x);
// ensure both arrays of points are the same size
if ($n != count($y)) {
trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
}
// calculate sums
$x_sum = array_sum($x);
$y_sum = array_sum($y);
$xx_sum = 0;
$xy_sum = 0;
for($i = 0; $i < $n; $i++) {
$xy_sum+=($x[$i]*$y[$i]);
$xx_sum+=($x[$i]*$x[$i]);
}
// calculate slope
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum));
// calculate intercept
$b = ($y_sum - ($m * $x_sum)) / $n;
// return result
return array("m"=>$m, "b"=>$b);
}
示例用法:
var_dump( linear_regression(array(1, 2, 3, 4), array(1.5, 1.6, 2.1, 3.0)) );
https://richardathome.wordpress.com/2006/01/25/a-php-linear-regression-function/
答案 1 :(得分:1)
我没有看到你的功能有直接问题,但如果它有时只会产生看似错误的结果,也许你有溢出问题。您使用的公式在计算上不够稳健。维基百科上的simple linear regression文章确实给出了一个不同的公式(就在你使用的公式前面) - 一个不太可能有溢出。