如何改进此线性回归函数?

时间:2010-12-30 14:50:18

标签: php math

我有以下用于绘制趋势线的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);

}

2 个答案:

答案 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文章确实给出了一个不同的公式(就在你使用的公式前面) - 一个不太可能有溢出。