ucr数据集_DTW在万亿规模时间序列数据上的相似度搜索

7f15d9143261cf8601833ac22757a0b5.png

文章主要针对时间序列数据挖掘算法的相似度搜索问题提出了新的优化策略,并验证了优化后的DTW(动态时间规整,Dynamic Time Warping)在超大规模数据集上相似度搜索的优势。大多数时间序列数据挖掘算法的核心都是相似度搜索,因此相似度搜索时间几乎是所有时间序列数据挖掘算法的瓶颈,尤其在大规模数据集上。根据不同查询序列或数据,文章提出的四种新优化策略使得相似度搜索速度提升了2~164倍,并且完成了精确搜索。

在深入了解文章提出的四种优化策略之前,我们先了解一些基础概念:

时间序列

时间序列

​是一个有限集,定义为

其中

,集合中每个元素都是一个二元组​
表示在​时刻
生成数据变量​
。关于时间序列挖掘主要有两个处理方向:表征方法和相似性度量。表征方法则主要包括离散傅里叶变化、奇异值分解等;相似性度量则主要包括欧式距离、动态时间规整算法和最长公共子序列算法等。

时间序列

的子序列
是指从
时刻开始的长度为
的序列。设查询序列为
,则与查询序列
匹配(或最相似)的子序列
就作为候选序列,记为
。定义查询序列的长度为
,即

时间序列间的相似性度量

文章主要关注了从相似性度量角度解决时间序列挖掘相关问题,其中着重关注了欧氏距离度量和动态时间规整算法。

欧式距离度量

查询序列

和候选序列
之间的欧氏距离定义为

,

如图所示,欧氏距离是两个等长序列的一一映射

ad9051e157586c77049023bfa5b328ce.png

欧氏距离的复杂度是线性的且容易计算。但是度量两个序列相似度时对噪声比较敏感,而且要求两个序列对齐,如上图所示,两个序列存在相位差所以峰值处并未对齐,尽管两个序列相似,但是其欧氏距离很大。这些限制了欧氏距离在时间序列相似性度量上的直接应用。针对欧氏距离的这个不足,动态时间规整(DTW,Dynamic Time Warping)作为一种解决途径被提出。

动态时间规整

动态时间规整(DTW,Dynamic Time Warping)是一种度量两个时间序列相似度的方法。DTW应用很广泛,在大多数领域中都是最佳度量方法。DTW将时间序列进行规整(延伸、缩短)使得两个序列的形态尽可能一致,得到最大可能的相似度。

5eafbf1f973d13b430f15f73826c6cca.png

如上图所示,与欧氏距离需要时间序列

在对齐时刻上一一映射不同,DTW不再是一一映射而可能是一对多映射。比如上图中序列
多个点对应序列
上一个点,或者相反。

DTW采用了动态规划(DP, Dynamic Programing)的方法来进行时间规整的计算。为了对齐两个序列,我们构造一个

的矩阵网格,矩阵元素
表示
两个点的距离
,一般采用欧氏距离,即
。每个矩阵元素
表示
的对齐。DTW算法可以归结为寻找一条通过此网格中若干格点的路径,路径通过的格点即为两个序列对齐的点。

02ae5a83ce619f38eb4542396832895e.png

那么如何找到最好的规整路径呢?首先,这个路径需要满足以下限制条件:

  1. 边界条件:路径必须从一个对角格子开始并且在另一个对角结束,比如从左下角出发,在右上角结束。
  2. 连续性:当路径中确定了一个格子,那么下一个格子必须是当前格子相邻的格子,不能跨越产生空洞。即在序列上不会出现跳跃点,每一个点都要进行对齐映射。
  3. 单调性:路径上的点只能随着时间单调的方向进行,这样在映射过程中不会出现交叉的现象。

此外,在实际应用中,通常还会有一个全局性限制条件,即规整路径偏离网格矩阵对角线的距离不能大于门限。如上图中两条绿线限定了规整路径不能超越这个范围,这个范围称为Sakoe-Chiba Band。

满足上述限制条件的路径非常多,我们需要从中选出一条最佳的路径,即以这个路径进行对齐映射时两个序列最相似也就是两个序列的距离最小。

定义累加距离为从(0, 0)点开始匹配这两个序列,每到一个点,之前所有的点计算的距离都会累加。到达终点(n, n)后,这个累积距离就是两个序列的距离。则经过规整路径得到累加距离为:

即累积距离γ(i,j)为当前格点距离d(i,j),也就是点qi和cj的欧式距离(相似性)与可以到达该点的最小的邻近元素的累积距离之和。

通过以上内容了解到了时间序列以及时间序列相似性度量的两种方法,那么接下来论文介绍了对基于欧氏距离和DTW的相似度搜索算法已经存在的优化方法,并在此基础上介绍了论文提出的四种优化策略。

已存在的优化方法

使用平方距离:无论欧氏距离计算还是DTW计算都存在平方根计算。一种优化方法就是不再用平方根计算而直接使用平方作为是否邻近的相对度量。如此在一个对起点就可以减少一次运算。而最终输出距离时再进行平方根计算。

引入下确界:如果在进行序列搜索前能够提前排除那些不能够是最优目标的序列,那么在剩下的候选序列中再进行距离度量时,计算量就会相对小很多,能够起到加速搜索的作用。为了能够提前排除没有可能的序列,寻找一个复杂度相对小的边界就显得至关重要。下图就简单说明了两种下确界的方法

70f3c8b86e56dc7252141fae33bbbb98.png
  • 下确界:如左图所示,用序列
    和序列
    第一个或最后一个对起点的距离作为下确界,其复杂度为
    。这个下确界是论文对
    下确界的一种简化。
  • 下确界:如右图所示,用序列
    和 上包络序列
    、下包络序列
    中最近点的欧氏距离作为下确界,其复杂度为

对欧式距离和

下确界的提前终止:
在计算欧氏距离或者
下确界时,如果到某点时距离已经超出某个门限时,则在这个点处就停下来,不再对后续点进行计算。其中这个门限可以为已经计算过距离的子序列的最小距离。

计算DTW时提前终止:定义DTW距离的下确界为

当这个下确界超出门限时,则提前终止DTW计算并排除后续序列

3d79d25bf53315afeff4aa73aae9f10a.png

应用硬件多核:当前CPU的多核已经很普遍,所以充分硬件的多核来提升速度也是一种常用的优化手段。

论文提出的四种优化策略

四种优化策略主要针对基于欧氏距离或DTW距离的相似性搜索

Z-Score标准化过程中提前终止:论文认为对序列数据进行Z-Score标准化和进行欧氏距离计算同样耗时,甚至耗时更多。所以论文采取了将数据标准化过程和欧氏距离计算或者下确界计算过程交叉进行,这样如果由欧氏距离或者下确界排除了候选序列,那么对候选序列的标准化也随之停止,这样就起到了减少数据量提升速度的效果。这个过程可以概括为如下图所示算法过程

b79cbf2873e649b2a45335a3b7b8c9ed.png

对序列重排序以提前终止:在欧氏距离和

下确界计算时,对查询序列
重新排序可以起到优化加速的效果。具体是对序列
完成Z-Score标准化之后,按照处理后的绝对值大小进行由小到大的排序,然后按照这个顺序进行距离计算,因为集中在零均值附近的值占多数且对距离贡献较大。这样的话,不满足下确界要求的候选序列
会被提前识别出来。下图中左图为正常的计算顺序,右图是重新排序后的计算顺序,若序列
不满足下确界要求,则右图的方式显然会比左图更快发现。

6796816ab92f6851d99d5a41334bf20d.png

计算

下确界时交换查询序列和数据序列的角色:
常规
下确界过程中是对查询序列
建立上下包络线(
),然后求候选序列
到上下包络线最近对应点的欧氏距离和作为下确界,在此记为
,如下图中的左子图。论文则是对候选序列
建立上下包络线(
),然后求查询序列
到上下包络线最近对应点的欧氏距离和作为下确界,在此记为
,如右子图所示。

14e847c0c4d9634e020470e33909cd41.png

级联多种下确界进行数据过滤:论文不是采用一种下确界方法作为全局的下确界策略,而是将下图中在虚线上的下界方法进行级联作为全局的下界策略。若候选序列

依次满足
下确界之后再进过
完成合格的候选序列搜索。

75112801e9ab7266578ffb8eb6e07fb5.png

上图中横轴是算法的复杂度,纵轴是下界与最佳距离的紧密程度。当候选序列

不满足
时,此时仅需要
复杂度的计算就可以将其排除。有此可知只有最佳序列才需要完成复杂度高的计算。同时,论文指出级联的每一个下确界方法对整体相似度搜索提速都非常重要,缺少任何一个都会导致搜索速度慢至少两倍。

[1] https://www.cs.ucr.edu/~eamonn/SIGKDD_trillion.pdf

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UCR数据集是一个常用的时间序列数据集,其中包含了许多用于分类的数据。在Python中,使用UCR数据集可以使用tslearn库来实现。tslearn库是一个时间序列处理库,提供了多种时间序列数据处理和分析工具。在tslearn中,可以使用datasets模块来加载UCR数据集并进行操作。以下是具体的步骤: 1. 安装tslearn库 可以在终端中输入以下命令来安装: pip install tslearn 2. 加载UCR数据集 可以使用datasets模块来加载UCR数据集: from tslearn.datasets import UCR_UEA_datasets x_train, y_train, x_test, y_test = UCR_UEA_datasets().load_dataset(dataset_name) 其中,dataset_name是数据集的名称,比如”ECGFiveDays”。x_train和y_train是训练集数据和标签,x_test和y_test是测试集数据和标签。 3. 数据预处理 在训练模型之前,需要对数据进行预处理。常用的方法包括标准化、归一化、特征提取等。可以使用tslearn提供的工具函数来实现: from tslearn.preprocessing import TimeSeriesScalerMeanVariance scaler = TimeSeriesScalerMeanVariance(mu=0.0, std=1.0) x_train = scaler.fit_transform(x_train) x_test = scaler.transform(x_test) 在这里,使用了TimeSeriesScalerMeanVariance函数对数据进行了标准化处理,使得数据的均值为0,标准差为1。 4. 构建模型并训练 在经过预处理之后,可以使用任意的分类模型对数据进行分类。常用的模型包括KNN、SVM、随机森林等。以下是使用KNN模型对数据进行分类的示例代码: from tslearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=5, metric='dtw') knn.fit(x_train, y_train) score = knn.score(x_test, y_test) 5. 模型预测和评估 在训练完模型之后,可以使用训练好的模型对新的时间序列数据进行分类预测,以及对模型进行评估。以下是KNN模型的预测和评估代码: y_pred = knn.predict(x_test) accuracy = np.mean(y_pred == y_test) print(f"Accuracy: {accuracy:.2%}") 这里使用了np.mean函数来计算预测准确率。可以根据需要选择不同的评估指标。 总体来说,使用tslearn库中的datasets模块,可以方便地加载UCR数据集并进行分类模型的训练和评估。需要注意的是,在加载数据集之后需要对数据进行预处理,并根据具体情况选择合适的分类模型进行训练和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值