首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测传感器数据的变化点

检测传感器数据的变化点
EN

Stack Overflow用户
提问于 2014-03-02 10:17:14
回答 2查看 256关注 0票数 1

我有很多传感器数据,我需要能够可靠地检测变化。从根本上讲,它来自远程客户端的水位传感器。它使用加速度计和浮子来测量水位。我的问题是,数据有时会很嘈杂(每次测量变化2到5个单位),有时我需要检测到低到7-9个单位的变化。

当我绘制数据时,对于人类来说,很明显是有变化的,但我如何才能明智地进行编程呢?现在,我只是尝试通过编程来检测大于x的更改,但它并不太可靠。我附上了一个样本图,并用箭头指出了变化。最初的巨大变化只是测试,所以这不是数据的正常行为。

数据在MYSQL数据库中,代码在PHP中,所以如果您能指出正确的方向,我将非常感激!

编辑:数据中也可能有一些尖峰,它们被认为是无效的,而是数据中的一个错误。

编辑:示例数据可以从http://pastebin.com/x8C9AtAk中找到,算法需要每30分钟左右运行一次,并且应该能够在最后2-4页中检测到变化。每隔3~5分钟一次.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-03 11:33:39

我做了一些awk,你,或其他人,可能想试验。我对不包括当前样本的最后10 (m)样本进行平均,并对最后2个样本(n)进行平均,然后计算两者之间的差异,并在绝对差超过阈值时输出消息。

代码语言:javascript
复制
#!/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之前删除双引号。

以下是输出的摘录:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 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是所有感兴趣的假设,例如“时间的幅度步长”或“幅度的噪声”。在这种情况下,可能有大量可信的假设,涵盖所有可能的规模和时间。为了使问题易于处理,您可能需要限制所考虑的假设的范围,例如,只回顾一定数量的时间步骤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22126323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档