如何计算PHP中的趋势线?

Ste*_*hen 12 php math curve-fitting coordinates least-squares

所以我已经阅读了计算图表趋势线的两个相关问题,但我仍然输了.

我有一个xy坐标数组,我想提出另一个xy坐标数组(可以是更少的坐标),它们代表使用PHP的对数趋势线.

我将这些数组传递给javascript以在客户端绘制图形.

Geo*_*off 29

对数最小二乘法

因为我们可以通过取对数函数转换成线log的的x值,我们可以执行线性最小二乘曲线拟合.事实上,我们已经完成了这项工作,并在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);

  }
Run Code Online (Sandbox Code Playgroud)

现在,这里是如何使用给出的方程来估计$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;
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要为Javascript生成点数:

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

在这种情况下,代码估计bFit = 5.17并且aFit = 9.7仅对50数据点非常接近.

替代文字

对于下面注释中给出的示例数据,对数函数不适合.

替代文字

最小二乘解决方案 y = -514.734835478 + 2180.51562281 * log(x)本质上是该领域中的一条线.