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,你如何知道数据在增加或减少,有没有一种方法可以测量增加和减少的比率,即以百分比的形式。
编辑
从我收到的评论中我得到了一个想法,这就是我尝试过的。我想要实现什么;
$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)