您可以使用旧值线性衰减的平均算法。如果 S_n 是时间 n 的速度,而 A_{n-1} 是时间 n-1 的平均值,则按如下方式定义您的平均速度。
A_1 = S_1
A_2 = (S_1 + S_2)/2
A_n = S_n/(n-1) + A_{n-1}(1-1/(n-1))
在英语中,这意味着过去进行的测量时间越长,它的重要性就越低,因为它的重要性已经减弱。
将此与正常的平均算法进行比较:
A_n = S_n/n + A_{n-1}(1-1/n)
你也可以让它几何衰减,这将非常重视最近的速度:
A_n = S_n/2 + A_{n-1}/2
如果速度是 4,3,5,6 那么
A_4 = 4.5(简单平均)
A_4 = 4.75(线性衰减)
A_4 = 5.125(几何衰减)
PHP 中的示例
请注意,$n+1(不是$n)是当前数据点的数量,因为 PHP 的数组是零索引的。要匹配上面的示例,请设置n == $n+1 或n-1 == $n
<?php
$s = [4,3,5,6];
// average
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
// $n+1 = number of data points so far
$weight = 1/($n+1);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// linear decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
elseif ($n == 1)
$a[$n] = ($s[$n] + $s[$n-1]) / 2;
else
{
// $n = number of data points so far - 1
$weight = 1/($n);
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
// geometric decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
if ($n == 0)
$a[$n] = $s[$n];
else
{
$weight = 1/2;
$a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
}
}
var_dump($a);
输出
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4
3 => float 4.5
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 4.8333333333333
array (size=4)
0 => int 4
1 => float 3.5
2 => float 4.25
3 => float 5.125