平滑时间序列数据


14

我正在构建一个Android应用程序,该应用程序在睡眠期间记录加速度计数据,以便分析睡眠趋势并有选择地在轻度睡眠期间将用户唤醒在所需时间附近。

我已经建立了收集和存储数据以及警报的组件。我仍然需要以一种非常有意义和清晰的方式来应对显示和保存睡眠数据的难题,最好也可以进行分析。

几张图片说了两千个字:(由于重复率低,我只能发布一个链接)

这是未过滤的数据,以30秒为间隔收集的移动总和

和相同的数据,通过我自己的移动平均平滑表现进行了平滑

编辑)这两个图表都反映了校准-有一个最小的``噪声''过滤器和一个最大截止过滤器以及一个警报触发电平(白线)

不幸的是,这些都不是最优的解决方案-第一个对于普通用户来说有点难以理解,第二个更容易理解,却隐藏了很多实际情况。特别是,平均消除了运动中尖峰的细节,我认为这些可能是有意义的。

那么,为什么这些图表如此重要?这些时间序列会在整个晚上作为对用户的反馈进行显示,并将在以后存储以供查看/分析。平滑处理将理想地降低内存成本(RAM和存储),并使这些资源匮乏的电话/设备上的渲染速度更快。

显然,有一种更好的方法来平滑数据-我有一些模糊的想法,例如使用线性回归来找出运动中的“尖锐”变化,并据此修改移动平均值的平滑度。在深入研究可以更优化地解决问题之前,我确实需要更多指导和意见。

谢谢!

Answers:


16

首先,压缩和分析/表示的要求不一定相同-实际上,对于分析,您可能希望保留所有原始数据,并具有以各种方式对其进行切片和切分的能力。而最适合您的方法将在很大程度上取决于您要从中获得什么。但是,您可以尝试多种标准技巧:

  • 使用差异而不是原始数据
  • 使用阈值消除低电平噪声。(合并时要忽略细微的变化。)
  • 使用方差在一定的时间窗口,而不是平均,以捕获活动水平,而不是运动
  • 将时基从固定间隔更改为可变长度游程,并累积到单个数据点变化序列中,这些变化序列具有某些条件(例如,同一方向上的差异,直至某个阈值)
  • 将数据从实际值转换为序数(例如,低,中,高);您也可以按时间段而不是单个样本执行此操作-例如,每5分钟一次的活动水平
  • 使用适当的卷积核 *可以比移动平均线更巧妙地平滑,或者挑选出感兴趣的特征(例如急剧变化)。
  • 使用FFT库计算功率谱

对于您的目的而言,最后一个可能会有点贵,但可能会给您一些非常有用的演示选项,例如“睡眠节律”等。(我对Android几乎一无所知,但是可以想象,某些/许多/所有手机可能都内置了可以利用的DSP硬件。)


*考虑到中央卷积对数字信号处理的影响,很难在网上找到可访问的介绍。或至少在Google搜索的3分钟内。建议欢迎!


10

有许多非参数平滑算法,包括样条和黄土。但是它们也会消除突然的变化。低通滤波器也会如此。我认为您可能需要基于小波的平滑器,该平滑器可以允许突然跳跃,但仍可以平滑噪声。

查看Percival和Walden(2000)以及相关的R包。尽管您需要Java解决方案,但R包中的算法是开源的,您也许可以翻译它们。


3

这在某种程度上与您的要求有关,但值得一看卡尔曼滤波器。


1

Savitzky-Golay平滑处理可能是一个很好的答案。这是在滑动时间窗口(对数据的卷积)上最小二乘平滑的极其有效的实现,最终将结果简化为将每个时间窗口中的数据乘以固定常数。您可以拟合值,导数,二阶导数和更高的值。

您可以根据滑动时间窗口的大小和该时间窗口上多项式拟合的程度来选择允许结果有多尖峰。那是最初为色谱法开发的,色谱峰是结果的重要组成部分。SG平滑的一个理想特性是保留了峰的位置。例如,具有三次曲线拟合的5到11点窗口可减少噪声,但仍保留峰值。

Wikipedia上有一篇不错的文章,尽管它被称为Savitzky-Golay 过滤器(从系统控制理论和时间序列分析以及原始论文(对它的正确命名为平滑)对正常术语进行了轻微的改动)。还应注意,维基百科文章中的二阶导数估算公式存在错误(对此有争议),请参阅该文章的“讨论”部分。编辑:维基百科文章已修复

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.