行。我有一系列来自gps设备的值,表明油箱中的油位:
80,80,78,79,78,77,72,78,72,78,77,76,75,74,34,33,33,33,32,32,32,
31,31,31,115,115,115,114,114
正如你所看到的,有一个正常的线性趋势,从80到74,除了72个值,这是一个很好的线性趋势。
然后燃油降到34,这表明我被盗了。之后消费没问题,因为它以线性方式降至31。
然后我的燃油加满了31到115.
如果我把它放在图表中,它非常清楚,你可以立即发现正在发生的事情。假设我想对这个系列做一些分析,并尝试在数学上找出有盗窃和重新填充的地方,我有哪些选择?
php或postgresql中有哪些工具可以实现此目的?
我尝试过循环,但结果非常不一致,因为我不得不考虑很多不同的场景而且太难了。
我正在考虑通过识别由部分分割的系列的平均值创建的线来分析值的趋势。
有关如何解决此问题的任何建议吗?
感谢。
答案 0 :(得分:2)
我计算项目(n)和(n + 1)之间的平均差异。考虑到你的系列,这应该介于0到3之间。然后将该值加倍并报告所有差异,这些差异更大,因为“这里有些奇怪的东西”。经验将显示“双倍价值”是否有意义,或“乘以1.5”或“乘以3”更好。
答案 1 :(得分:1)
根据Guntram Blohm's提示,您可以这样检查:
$string = '80,80,78,79,78,77,72,78,72,78,77,76,75,74,34,33,33,33,32,32,32,
31,31,31,115,115,115,114,114';
// Create an array of values. If array is available, no need for this part
$values = explode( ',', $string );
// Calculate the differences between numbers and store them in array for
// later analysis
$average = array();
for( $k=0; $k<count( $values )-1; $k++ ) {
$average[] = abs( $values[$k+1] - $values[$k] );
}
// Calculate the average difference
$total_average = array_sum( $average ) / count( $average );
// Check for differences that are way above average
$k=0;
foreach( $average as $value ) {
$k++;
if ( $value > $total_average * 3 )
echo '<strong>' . $value . ' <-- suspicious</strong> ['
. $values[$k-1] . '-><span style="color: #f00; font-weight: bold;">'
. $values[$k] . '</span>->' . $values[$k+1] . ']</br>';
else
echo $value . '</br>';
}
输出:
0
2
1
1
1
5
6
6
6
1
1
1
1
40 <-- suspicious [74->34->33]
1
0
0
1
0
0
1
0
0
84 <-- suspicious [31->115->115]
0
0
1
0