9

我正在为 Android 设备构建一个应用程序,该应用程序需要它通过加速度计数据识别步行噪声和双击它之间的区别。我正在尝试使用神经网络解决这个问题。

一开始它进行得非常好,教它识别噪音中的水龙头,例如站立/坐下和以较慢的速度四处走动。但是当它正常行走时,即使我给它输入了大量的噪音数据,它似乎也从来没有学习过。

我的问题:我的方法有什么严重的缺陷吗?问题是基于缺乏数据吗?

网络

我选择了一个 25 输入 1 输出的多层感知器,我正在使用反向传播对其进行训练。输入是每 20ms 的加速度变化,输出范围从 -1(无抽头)到 1(抽头)。我已经尝试了几乎所有隐藏输入的星座,但最幸运的是 3 - 10。

我正在使用 Neuroph 的 easyNeurons 进行培训并导出到 Java。

数据

我的总训练数据大约是 50 次双击和大约 3k 噪声。但我也尝试用与双击成比例的噪音来训练它。

数据如下所示(范围从 +10 到 -10):

坐着双击:坐姿双击,相当容易判断。


快步走: 快走和双击,没那么容易

所以重申我的问题:我的方法是否存在严重缺陷?我是否需要更多数据才能识别步行和双击之间的区别?还有其他提示吗?

更新

好的,经过多次调整,我们将基本问题归结为在快走时能够识别双击。坐着和经常(内部)步行我们可以很好地解决。

快步走 快步走

所以这是一些我先走然后停下,站着不动,然后走,在我走的时候做5次双击的测试数据。

如果有人对原始数据感兴趣,我将其链接为最新(快走)数据here

4

3 回答 3

4

你坚持使用神经网络吗?如果没有,这里有一个想法:

采取 0.5 秒的窗口并考虑曲线下的区域(或者由于您的信号是离散的,因此每个传感器读数的绝对值之和 - 所附图像中的红色区域)。您可能会发现,当用户走路时,这个总和很高,而当他们坐着和/或敲击时,这个总和要低得多。您可以设置一个阈值,高于该阈值时您认为在用户行走时采用给定窗口。或者,由于您有标记数据,您可以训练任何二元分类器来区分步行和不步行。

您可能可以通过考虑信号的其他特征来改进您的系统,例如线的锯齿状程度。如果电话放在桌子上,线路几乎是平的。如果用户正在打字,这条线会有点平,你会时不时地看到一个尖峰。如果他们正在行走,您会看到类似正弦波的东西。

在此处输入图像描述

于 2012-06-26T13:24:49.923 回答
3

您是否考虑过“快走”和“快走 + 双击”信号可能过于相似而无法仅使用加速度计数据进行区分?可能根本不可能达到超过一定量的准确度。

否则,神经网络可能是您的数据的不错选择,并且仍然有可能从中获得更好的性能。

这篇非常有用的论文 (http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf) 建议您对数据集进行白化,使其具有零均值和单位协方差。

此外,由于您的问题是分类问题,您应该确保使用交叉熵标准 (http://arxiv.org/pdf/1103.0398v1.pdf) 而不是 RMSE 来训练网络。(我不知道 Neuroph 是否支持交叉熵。)

正如其他海报所建议的那样,您可以尝试的另一件相对简单的事情是转换您的数据。使用 FFT 或 DCT 将数据转换到频域是时间序列分类的相对标准。

您还可以尝试在不同大小的窗口上训练网络并对结果进行平均。

如果您想尝试一些更困难的 NN 架构,您可以查看 Time-Delay-Neural-Network(只需在 google 上搜索该论文),它在其结构中考虑了多个窗口。使用其中一个 Torch 库 (http://www.torch.ch/) 来实现这一点应该相对简单,但是将网络导出到 Android 环境可能会很困难。

最后,在时间序列数据中获得更好分类性能的另一种方法是考虑相邻标签之间的关系。条件神经场(http://code.google.com/p/cnf/ - 注意:我从未使用过此代码)通过将神经网络集成到条件随机场中来做到这一点,并且取决于您实际中的行为模式数据,可能会做得更好。

于 2012-06-27T17:03:25.327 回答
1

可能会起作用的是首先使用傅里叶变换过滤数据。行走有一个类似窦的幅度,你的双击会在变换结果中突出显示为不同的频率。我猜神经网络可以确定数据是否包含您的双标签,因为它具有额外的频率(双标签频率)。一些问题仍然存在:

  1. 数据样本需要多长时间?
  2. 你的手机能做它需要做的所有工作吗,它有足够的处理能力吗?

您甚至可能要考虑为此使用 GPU。

另一种选择是使用傅立叶输出和一些好的旧模糊逻辑

这听起来很有趣……

于 2013-02-20T13:16:28.377 回答