我的问题如下:我需要对来自传感器的数据流进行分类。我已经通过窗口的中位数建立了一个基线,并从中减去数值(为了避免负峰值,我只使用差值的绝对值)。
现在我需要区分事件(= 触发了传感器)与基线附近的噪声:
问题是我不知道该使用哪种方法。我考虑了几种方法:
- 将窗口内的数值相加,如果总和超过阈值,则分类为事件(’积分和丢弃’)
- 将窗口内数值的差异相加并计算平均值(这类似于第一导数),如果值为正且超过阈值,则分类为事件,否则分类为无事件
- 两种方法的组合
(不幸的是,这些方法的缺点是我需要猜测阈值并设置窗口大小)
- 使用从手动分类数据中学习的SVM(但我不知道如何正确设置这个算法:我应该关注哪些特征,比如窗口的中位数/平均值?积分?第一导数?…)
你有什么建议吗?有没有更好的/更简单的方法来完成这项任务?
我知道有很多复杂的算法,但我对什么是最好的方法感到困惑 – 请对一个没有机器学习/DSP背景的新手有点耐心 🙂
非常感谢,最好的祝愿。
回答:
评估你的启发式方法的关键是开发一个系统行为模型。
例如,你监控的物理过程的模型是什么?你是否期望你的样本在时间上是相关的?
传感器输出的模型是什么?例如,它可以被建模为电压的离散线性函数吗?是否有噪声成分?噪声的幅度是已知的还是未知的但恒定的?
一旦你列出了你所监控的系统的知识,你就可以用它来评估和决定一个好的分类系统。你还可以估计其准确性,这对你的分类器输出的使用者很有用。
编辑:
鉴于更详细的描述,我建议在转向通用的监督学习启发式方法之前,先尝试使用经典技术处理一些简单的行为模型。
例如,假设:
-
基线、事件阈值和噪声幅度都是先验已知的。
-
基础过程可以建模为马尔可夫链:它有两个状态(关闭和开启),它们之间的转换时间呈指数分布。
然后你可以使用隐藏马尔可夫模型方法来确定在任何给定时间最可能的基础状态。即使噪声参数和阈值未知,你也可以使用HMM的前向-后向训练方法来训练与每个状态的输出相关的参数(例如,高斯分布的均值、方差)。
如果你对事件了解更多,你可以使用更简单的方法:例如,如果你知道事件信号总是达到基线+噪声以上的水平,并且事件在时间上总是由大于事件本身宽度的间隔分隔,你可以只进行一个简单的阈值测试。
编辑:
关于HMM的经典介绍是Rabiner的教程(这里可以找到副本)。相关资料还有这些勘误。