我正在为Android设备开发一个应用程序,要求它通过加速度计数据识别步行噪声和双击它之间的区别。我试着用神经网络来解决这个问题。
在开始的时候,它进行得很好,教它从噪音中识别水龙头,比如站起来/坐下来,以较慢的速度走动。但是,当涉及到正常行走时,它似乎从未学习过,即使我用大量的噪音数据给它喂食。
我的问题:我的方法有什么严重的缺陷吗?这个问题是基于缺乏数据吗?
网络
我选择了一个25输入1输出多层感知器,这是我的反向传播训练.输入是每20毫秒加速的变化,输出范围从-1 (对于非抽头)到1(对于抽头)。我已经尝试了几乎所有隐藏输入的星座,但最幸运的是3-10。
我正在使用Neuroph的easyNeurons进行培训,并将其导出到Java。
数据
我的总训练数据是大约50件双水龙头和大约3k噪音。但我也试着用比例的噪音来训练它。
数据如下(范围从+10到-10):
坐双水龙头:

快速行走:

因此,我要重申我的问题:我在这里的做法是否存在严重缺陷?我需要更多的数据来识别步行和双敲击的区别吗?还有其他建议吗?
更新
好的,经过很多调整后,我们把基本的问题归结为能够识别双水龙头,同时轻快地散步。坐着,经常散步,我们能解决得很好。
轻快行走

这是一些测试数据,我先走路,然后停下来,站着,然后走路,在我走路的时候做5个双水龙头。
如果有人对原始数据感兴趣,我将其链接到最新的(快步)数据这里。
发布于 2012-06-27 17:03:25
你有没有想过,“快走”和“快走+双敲击”信号可能太相似,不能仅用加速度计的数据来区分?它可能根本不可能达到一定数量以上的准确性。
否则,神经网络可能是一个很好的选择,你的数据,它仍然有可能获得更好的性能。
这篇非常有用的论文(http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)建议您对数据集进行白化,使其具有零和单位协方差的平均值。
此外,由于您的问题是一个分类问题,您应该确保您正在使用交叉熵标准(http://arxiv.org/pdf/1103.0398v1.pdf )而不是RMSE来训练网络。(我不知道Neuroph是否支持交叉熵。)
另一件你可以尝试的相对简单的事情,如其他海报所建议的,就是转换你的数据。使用FFT或DCT将数据转换为频域是时间序列分类的相对标准。
您还可以尝试在不同大小的窗口上对网络进行培训,并对结果进行平均处理。
如果你想尝试一些更困难的神经网络架构,你可以看看时延-神经网络(只是谷歌这个文件),它的结构考虑了多个窗口。使用一个火炬库(http://www.torch.ch/)实现这一点应该相对简单,但可能很难将网络导出到Android环境中。
最后,在时间序列数据中获得更好分类性能的另一种方法是考虑相邻标签之间的关系。条件神经字段(http://code.google.com/p/cnf/ -注:我从未使用过这段代码)通过将神经网络集成到条件随机场来实现这一点,并且,根据实际数据中的行为模式,可能会做得更好。
发布于 2012-06-26 13:24:49
你坚持使用神经网络吗?如果没有,这里有一个想法:
取0.5秒的窗口,考虑曲线下的面积(或者由于信号是离散的,每个传感器的绝对值之和--附图中的红色区域)。您可能会发现,当用户走路时,这个总和很高,而当用户坐着和/或轻拍时,则要低得多。您可以设置一个阈值,在此阈值之上,当用户行走时,您可以将给定的窗口考虑在内。或者,由于您有标记数据,您可以训练任何二进制分类器来区分行走和不行走。
您可能可以通过考虑信号的其他特性来改进您的系统,比如线条的锯齿状。如果电话在桌子上,电话线几乎是平的。如果用户正在打字,那行就会是平的,你会时不时地看到一个尖峰。如果他们在走路,你会看到像正弦波一样的东西。

发布于 2013-02-20 13:16:28
可能会起作用的是首先使用傅利叶转换过滤数据。走路有一个像鼻窦一样的振幅,你的双拍子会在转换结果中脱颖而出--作为一个不同的频率。我猜神经网络可以确定数据是否包含双标签,因为它有额外的频率(双制表符频率)。有些问题仍然存在:
您甚至可以考虑使用GPU来完成这个任务。
另一种选择是使用傅里叶输出和一些好的老模糊逻辑。
听起来很有趣..。
https://stackoverflow.com/questions/11166647
复制相似问题