我做了一些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
如何卡爾曼濾波? –
給我們提供一些數據可以玩嗎?不知道你的樣本有多頻繁,所以也許上傳數據到不同的網站,並提供一個鏈接,如果有很多。另外,如果僅僅是事後看來才能檢測到變化,或者必須在「數據到達」或「即時」類型中檢測到這些變化,那麼可以嗎? –
你應該看看[平滑算法](http://en.wikipedia.org/wiki/Smoothing)。另一種選擇是通過取k個數據點範圍的平均值,將一系列數據點轉換爲單個數據點。然後,您會比較每個其他數據點,以查看是否存在平均值的顯着變化(大於可能計入錯誤的值)。如果有,則更改可能發生在您檢查的兩個數據點之間的數據點內。無論如何,要玩的數據都會有很大的幫助。 – Nuclearman