我有很多传感器数据,我需要能够可靠地检测变化。从根本上讲,它来自远程客户端的水位传感器。它使用加速度计和浮子来测量水位。我的问题是,数据有时会很嘈杂(每次测量变化2到5个单位),有时我需要检测到低到7-9个单位的变化。
当我绘制数据时,对于人类来说,很明显是有变化的,但我如何才能明智地进行编程呢?现在,我只是尝试通过编程来检测大于x的更改,但它并不太可靠。我附上了一个样本图,并用箭头指出了变化。最初的巨大变化只是测试,所以这不是数据的正常行为。
数据在MYSQL数据库中,代码在PHP中,所以如果您能指出正确的方向,我将非常感激!
编辑:数据中也可能有一些尖峰,它们被认为是无效的,而是数据中的一个错误。
编辑:示例数据可以从http://pastebin.com/x8C9AtAk中找到,算法需要每30分钟左右运行一次,并且应该能够在最后2-4页中检测到变化。每隔3~5分钟一次.

发布于 2014-03-03 11:33:39
我做了一些awk,你,或其他人,可能想试验。我对不包括当前样本的最后10 (m)样本进行平均,并对最后2个样本(n)进行平均,然后计算两者之间的差异,并在绝对差超过阈值时输出消息。
#!/bin/bash
awk -F, '
# j will count number of samples
# we will average last m samples and last n samples
BEGIN {j=0;m=10;n=2}
{d[j]=$3;id[j++]=$1" "$2} # Store this point in array d[]
END { # Do this at end after reading all samples
for(i=m-1;i<j;i++){ # Iterate over all samples, except first few while building average
totlastm=0 # Calculate average over last m not incl current
for(k=m;k>0;k--)totlastm+=d[i-k]
avelastm=totlastm/m # Average = total/m
totlastn=0 # Calculate average over last n
for(k=n-1;k>=0;k--)totlastn+=d[i-k]
avelastn=totlastn/n # Average = total/n
dif=avelastm-avelastn # Calculate difference between ave last m and ave last n
if(dif<0)dif=-dif # Make absolute
mesg="";
if(dif>4)mesg="<-Change detected"; # Make message if change large
printf "%s: Sample[%d]=%d,ave(%d)=%.2f,ave(%d)=%.2f,dif=%.2f%s\n",id[i],i,d[i],m,avelastm,n,avelastn,dif,mesg;
}
}
' <(tr -d '"' < levels.txt)最后一位<(tr...)只是在将文件levels.txt发送到awk之前删除双引号。
以下是输出的摘录:
18393344 2014-03-01 14:08:34: Sample[1319]=343,ave(10)=342.00,ave(2)=342.00,dif=0.00
18393576 2014-03-01 14:13:37: Sample[1320]=343,ave(10)=342.10,ave(2)=343.00,dif=0.90
18393808 2014-03-01 14:18:39: Sample[1321]=343,ave(10)=342.10,ave(2)=343.00,dif=0.90
18394036 2014-03-01 14:23:45: Sample[1322]=342,ave(10)=342.30,ave(2)=342.50,dif=0.20
18394266 2014-03-01 14:28:47: Sample[1323]=341,ave(10)=342.20,ave(2)=341.50,dif=0.70
18394683 2014-03-01 14:38:16: Sample[1324]=346,ave(10)=342.20,ave(2)=343.50,dif=1.30
18394923 2014-03-01 14:43:17: Sample[1325]=348,ave(10)=342.70,ave(2)=347.00,dif=4.30<-Change detected
18395167 2014-03-01 14:48:25: Sample[1326]=345,ave(10)=343.20,ave(2)=346.50,dif=3.30
18395409 2014-03-01 14:53:28: Sample[1327]=347,ave(10)=343.60,ave(2)=346.00,dif=2.40
18395645 2014-03-01 14:58:30: Sample[1328]=347,ave(10)=343.90,ave(2)=347.00,dif=3.10发布于 2014-03-02 21:42:41
解决这类问题的正确途径是建立感兴趣现象模型和噪声过程模型,并给出一些数据。这些推论必然是概率性的。您需要进行的一般计算是P(H_k | data) = P(data | H_k) P(H_k) / (sum_k (P(data | H_k) P(H_k)) ( Bayes规则的一种广义形式),其中H_k是所有感兴趣的假设,例如“时间的幅度步长”或“幅度的噪声”。在这种情况下,可能有大量可信的假设,涵盖所有可能的规模和时间。为了使问题易于处理,您可能需要限制所考虑的假设的范围,例如,只回顾一定数量的时间步骤。
https://stackoverflow.com/questions/22126323
复制相似问题