php - 如何在 PHP 中计算趋势线?

标签 php math coordinates curve-fitting least-squares

所以我已经阅读了计算图表趋势线的两个相关问题,但我仍然迷失方向。

我有一个 xy 坐标数组,我想用 PHP 提供另一个 xy 坐标数组(可以更少的坐标)来表示对数趋势线。

我将这些数组传递给 JavaScript 以在客户端绘制图表。

最佳答案

对数最小二乘法

由于我们可以通过取 x 值的 log 将对数函数转换为直线,因此我们可以执行 linear least squares曲线拟合。事实上,这项工作已经帮我们完成了,解决方案在 Math World 中给出。 .

简而言之,我们得到的 $X$Y 值来自 y = a + b * log(x)。最小二乘法将给出一些值 aFitbFit,以最小化从参数曲线到给定数据点的距离。

以下是 PHP 中的示例实现:

首先,我将生成一些具有由 $a$b 给出的已知基础分布的随机数据

  // True parameter valaues
  $a = 10;
  $b = 5;

  // Range of x values to generate
  $x_min = 1;
  $x_max = 10;
  $nPoints = 50;

  // Generate some random points on y = a * log(x) + b
  $X = array();
  $Y = array();
  for($p = 0; $p < $nPoints; $p++){
    $x = $p / $nPoints * ($x_max - $x_min) + $x_min;
    $y = $a + $b * log($x);

    $X[] = $x + rand(0, 200) / ($nPoints * $x_max);
    $Y[] = $y + rand(0, 200) / ($nPoints * $x_max);

  }

现在,介绍如何使用给出的方程来估计 $a$b

  // Now convert to log-scale for X
  $logX = array_map('log', $X);

  // Now estimate $a and $b using equations from Math World
  $n = count($X);
  $square = create_function('$x', 'return pow($x,2);');
  $x_squared = array_sum(array_map($square, $logX));
  $xy = array_sum(array_map(create_function('$x,$y', 'return $x*$y;'), $logX, $Y));

  $bFit = ($n * $xy - array_sum($Y) * array_sum($logX)) /
          ($n * $x_squared - pow(array_sum($logX), 2));

  $aFit = (array_sum($Y) - $bFit * array_sum($logX)) / $n;

然后,您可以根据需要为 Javascript 生成任意密集的点:

  $Yfit = array();
  foreach($X as $x) {
    $Yfit[] = $aFit + $bFit * log($x);
  }

在本例中,代码估计 bFit = 5.17aFit = 9.7,仅对于 50 个数据点而言非常接近。

alt text

对于下面评论中给出的示例数据,对数函数不太适合。

alt text

最小二乘解为y = -514.734835478 + 2180.51562281 * log(x),它本质上是该域中的一条线。

关于php - 如何在 PHP 中计算趋势线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2768885/

相关文章:

c - 纯 C 中的符号计算库

javascript - 在 JavaScript 中计算两个或三个数字的 LCM

c++ - 矩形碰撞

javascript - 将图 block 层的中心与传单上 map 的中心相匹配

php - 带 max 和 group by 的 Laravel 查询

php - Symfony 和 Bootstrap dateTimePicker : expected a string

javascript - 使用for循环计数定位

2d - 屏幕坐标到等距坐标

php - 无需刷新即可更改网页上文本的最佳方法

PHP和mysql字符集问题