数据增强方法(时间序列)

本文介绍了三种时间序列数据增强技术:DBA(DTW Barycentric Averaging)利用加权平均创造新序列,WS(window slicing)和WW(window warping)通过切片和变形扩展数据。此外,还探讨了在时间序列分类中应用的GAN网络的改进版,如GAN、DCGAN和WGAN。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.DBA( DTW Barycentric Averaging):基于加权形式的DTW中心平均技术,通过改变权重,可以从给定的一组时间序列创建无穷多个新的时间序列。作者在3种加权方法中采用了一种叫做平均选择法的加权方法

  • 从训练集中随机选取一个初始时间序列,赋予它0.5的权重,这个随机选择的时间序列将作为DBA的初始化时间序列
  • 根据DTW距离,找到DBA初始化时间序列的最近的5个时间序列
  • 从5个最近邻中随机选择两个,分被赋予0.15的权重
  • 为使总的权重为1,此时剩余权重为1-0.5-0.15*2=0.2,将剩下的序列平均分配这0.2的权重

最后使用两个集成的ResNet网络(有数据增强和无数据增强),计算两个分类器输出每个类的后验概率求平均值,为每个时间序列分配平均概率最大的标签

参考:《Data augmentation using synthetic data for time series classification with deep residual networks》

代码: https://github.com/hfawaz/aaltd18

2.WS(window slicing)and WW(window warping)

  • WS:移动窗口法:设定窗口大小(文章将切片大小设为原始片段长度的90%),从时间序列中提取窗口大小的切片,并赋予与原始时间序列相同的标签
  • WW:对时间序列中的部分片段(文章将切片大小设为原始片段长度的10%)进行拉伸或压缩,这会使时间序列的长度不同,然后使用窗口切片法将时间序列统
### 时间序列数据增强方法 时间序列数据增强是指通过各种技术手段来增加可用的数据量或改变现有数据的形式,从而提高机器学习模型的泛化能力和性能。具体到多频时间序列,在本研究中,根据特定公式将三个不同频率的时间序列组合成一个多频时间序列,其中参数设定为 \( k_1=88 \),\( k_2=222 \),\( k_3=333 \)[^1]。 #### 方法一:噪声注入 一种常见的做法是在原始信号上叠加随机生成的小幅度高斯白噪音或其他类型的扰动项。这种方法简单易行,能够有效提升网络对于微弱变化的学习能力。 ```python import numpy as np def add_noise(ts, noise_level=0.05): """Add Gaussian white noise to time series.""" return ts + noise_level * np.random.normal(size=len(ts)) ``` #### 方法二:时间扭曲(Time Warping) 通过对某些局部区域内的采样点进行拉伸或压缩操作,模拟实际场景下可能出现的速度波动情况。这有助于改善模型应对非线性变换的能力。 ```python from scipy.interpolate import interp1d def time_warp(ts, sigma=0.2, knot=4): """Apply random warping on a given timeseries""" orig_steps = np.arange(len(ts)) start_points = sorted(np.random.choice(orig_steps[:-knot], size=knot, replace=False)) end_points = [p + int((np.random.rand() - 0.5) * sigma * len(ts)) for p in start_points] wp = np.linspace(start_points[0], end_points[-1], num=len(ts)).astype(int) f = interp1d(wp, ts[start_points]) warped_ts = f(orig_steps).clip(min=-1e6,max=1e6) return warped_ts.tolist() ``` #### 方法三:窗口切片(Window Slicing) 从较长的时间序列片段中截取较短子串作为新的样本输入给定模型训练使用;也可以反过来拼接多个相邻但不重叠的小段形成更长的新实例。 ```python def window_slice(ts, win_size_ratio=(0.1, 0.9)): """Slice windows from original sequence with varying sizes""" low_bound, up_bound = map(lambda x: int(x*len(ts)), win_size_ratio) slice_len = np.random.randint(low_bound,up_bound+1) start_idx = np.random.randint(0,len(ts)-slice_len+1) sliced_part = ts[start_idx:start_idx+slice_len] return padded_sequence(sliced_part, length=len(ts)) ``` 以上三种方式均可以单独应用亦或是联合起来共同作用于同一组或多组时间序列之上,以此达到更好的效果。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值