Как мне улучшить эту функцию линейной регрессии? - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть следующая функция 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 ]

2 голосов
/ 25 ноября 2014

Это хорошая функция, созданная Ричардом @ 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 голос
/ 30 декабря 2010

Я не вижу прямой проблемы с вашей функцией, но если она дает неправильные результаты только иногда, возможно, у вас проблемы переполнения.Используемая вами формула не является надежной в вычислительном отношении.Статья о простой линейной регрессии в Википедии дает другую формулу (прямо перед используемой вами формулой), которая с меньшей вероятностью будет иметь переполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...