PHP中如何判断数据是增加还是减少

kik*_*yu1 3 php algorithm math statistics linear-regression

假设数组中有以下数据:

$data1 = [3,5,7,6,8,9,13,14,17,15,16,16,16,18,22,20,21,20];

$data2 = [23,18,17,17,16,15,16,14,15,10,11,7,4,5];

我们可以$data1说数据在增加,而数据在$data2减少。

使用 PHP,你如何知道数据在增加或减少,有没有一种方法可以测量增加和减少的比率,即以百分比的形式。

编辑

从我收到的评论中我得到了一个想法,这就是我尝试过的。我想要实现什么;

  1. 我想知道传入数据的趋势是向上还是向下。
  2. 还想知道数据上升或下降的速率。例如$data1 = [1,3,5];不一样$data2 = [1, 20, 55];。可以看到$data1增长率不一样$data2
function increaseOrDecrease($streams = []) : array
{
        $streams = [3,5,7,6,8,9,13,14,17,15,16,16,16,18,22,20,21,20]; // For the increasing

        //$streams = [23,18,17,17,16,15,16,14,15,10,11,7,4,5]; // For the decreasing

        $first = 0;
        $diff = [];

        foreach ($streams as $key => $number) {
            if ($key != 0) {
                $diff[] = $number - $first;
            }
            $first = $number;
        }        

        $avgdifference = array_sum($diff)/count($diff); //Get the average

        $side = $avgdifference > 0 ? 'UP' : 'DOWN';

        $avgsum = array_sum($streams)/count($streams);

        $percentage = abs($avgdifference)/$avgsum * 100;
        
        if ($side == 'UP') {            
            $data = [
                'up' => true,
                'percent' => $percentage,
            ];            
        }else {
            $data = [
                'up' => false,
                'percent' => $percentage,
            ];
        }

        return $data;
}
Run Code Online (Sandbox Code Playgroud)

我需要一些帮助来重构此代码或解决问题的最佳方法。

Oli*_*ier 10

有多种方法可以分析数据并提取趋势。最经典的方法称为 最小二乘法。这是一种通过数据拟合直线的方法。该方法计算直线的斜率和截距。趋势只是斜率。

此处给出了公式。

PHP 实现如下:

function linearRegression($x, $y)
{
    $x_sum = array_sum($x);
    $y_sum = array_sum($y);
    $xy_sum = 0;
    $x2_sum = 0;
    $n = count($x);
    for($i=0;$i<$n;$i++)
    {
        $xy_sum += $x[$i] * $y[$i];
        $x2_sum += $x[$i] * $x[$i];
    }
    $beta = ($n * $xy_sum - $x_sum * $y_sum) / ($n * $x2_sum - $x_sum * $x_sum);
    $alpha = $y_sum / $n - $beta * $x_sum / $n;
    return ['alpha' => $alpha, 'beta' => $beta];
}

function getTrend($data)
{
    $x = range(1, count($data)); // [1, 2, 3, ...]
    $fit = linearRegression($x, $data);
    return $fit['beta']; // slope of fitted line
}
Run Code Online (Sandbox Code Playgroud)

例子:

echo getTrend([1, 2, 3]); // 1
echo getTrend([1, 0, -1]); // -1
echo getTrend([3,5,7,6,8,9,13,14,17,15,16,16,16,18,22,20,21,20]); // 1.065
echo getTrend([23,18,17,17,16,15,16,14,15,10,11,7,4,5]); // -1.213
Run Code Online (Sandbox Code Playgroud)