我正在为Android设备构建一个应用程序,要求它通过加速度计数据识别行走噪音和双击它之间的差异。我正在尝试使用神经网络来解决这个问题。
一开始它很顺利,教它识别噪音的水龙头,比如站立/坐下以及以较慢的速度走动。但是当谈到正常行走时,即使我用很大比例的噪音数据喂它也似乎从未学过。
我的问题:我的方法有任何严重缺陷吗?问题是基于缺乏数据吗?
我选择了一个25输入1输出的多层感知器,我正在用反向传播进行训练。输入是每20ms加速度的变化,输出范围从-1(对于无敲击)到1(对于敲击)。我已经尝试了几乎所有隐藏输入的组合,但最幸运的是3-10。
我正在使用Neuroph的easyNeurons进行培训并导出到Java。
我的总训练数据大约是50个双击和大约3k噪音。但我也尝试用一定比例的噪音来训练它以达到双击。
数据如下(范围从+10到-10):
双击:
快走:
重申我的问题:我的方法是否存在严重缺陷?我是否需要更多数据来识别步行和双击之间的区别?还有其他提示吗?
更新
好的,经过多次调整,我们已经将基本问题归结为能够识别双击同时快步走。坐着和经常(内部)散步我们可以很好地解决。
轻快地走路
所以这是我先行走的一些测试数据,然后停下来,站着不动,然后走路,在我走的时候做了5次双击。
如果有人对原始数据感兴趣,我会将其链接到最新(快走)数据here
答案 0 :(得分:4)
你坚持使用神经网络吗?如果没有,这是一个想法:
采用0.5秒的窗口并考虑曲线下方的区域(或者因为您的信号是离散的,每个传感器读数的绝对值之和 - 附加图像中的红色区域)。当用户走路时,您可能会发现该总和很高,而当他们坐着和/或敲击时,这个总和要低得多。您可以设置一个阈值,在该阈值之上,您可以考虑在用户行走时拍摄给定窗口。或者,由于您已经标记了数据,因此您可以训练任何二元分类器来区分步行和不步行。
您可以通过考虑信号的其他功能来改善您的系统,例如线条的锯齿状。如果手机坐在桌子上,线路几乎是平的。如果用户正在打字,那么这条线就会变得平坦,你会偶尔看到一个尖峰。如果他们走路,你会看到类似正弦波的东西。
答案 1 :(得分:3)
您是否认为“快走”和“快走+双击”信号可能过于相似而无法仅使用加速度计数据进行区分?可能根本无法达到一定数量以上的准确度。
否则,神经网络可能是您数据的一个很好的选择,它仍然可能从中获得更好的性能。
这篇非常有用的论文(http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)建议您对数据集进行白化,使其平均值为零和单位协方差。< / p>
此外,由于您的问题是分类问题,因此您应确保使用交叉熵标准(http://arxiv.org/pdf/1103.0398v1.pdf)而不是RMSE来培训网络。 (我不知道Neuroph是否支持交叉熵。)
正如其他海报所建议的那样,你可以尝试的另一个相对简单的事情是改变你的数据。使用FFT或DCT将数据转换到频域是时间序列分类的相对标准。
您还可以尝试在不同大小的窗口上训练网络并对结果取平均值。
如果你想尝试一些更难的NN架构,你可以看看时间延迟 - 神经网络(只是谷歌这篇文章),它在结构中考虑了多个窗口。使用其中一个Torch库(http://www.torch.ch/)实现这一点应该相对简单,但可能很难将网络导出到Android环境。
最后,另一种在时间序列数据中获得更好分类性能的方法是考虑相邻标签之间的关系。条件神经域(http://code.google.com/p/cnf/ - 注意:我从未使用过此代码)通过将神经网络集成到条件随机字段中来实现此目的,并且根据实际行为模式数据,可能会做得更好。
答案 2 :(得分:1)
可能首先使用Fourier转换过滤数据。步行具有类似于窦的振幅,您的双击在变换结果中会以不同的频率突出。我猜一个神经网络可以确定数据是否包含双选项卡,因为它具有额外的频率(双标签频率)。有些问题仍然存在:
你可能甚至想考虑使用GPU。
另一个选择是使用傅里叶输出和一些好的旧Fuzzy Logic。
这听起来很有趣......