最长公共子序列

这个例子展示了时间序列之间的LCSS计算,并绘制了对齐路径[1]及其与DTW的关系。

由于LCSS专注于两个时间序列之间的相似部分,一个潜在的应用场景是识别长度差异较大或含有噪声的时间序列之间的相似性。例如,M. Vlachos等人[1]使用这种方法在存在噪声的情况下对人类书写的时间序列进行聚类。

该示例演示了使用函数 lcss_pathdtw_path 来计算它们之间的对齐路径,并比较在处理不等长序列数据和噪声时的两种方法。

[1] M. Vlachos, D. Gunopoulos, 和 G. Kollios. 2002. “发现相似的多维轨迹”,在第18届国际数据工程会议(ICDE '02)的会议录中。IEEE计算机协会,美国,673页。

  • Time series matching with LCSS
  • Time series matching with DTW
# Author: Daniela Duarte
# License: BSD 3 clause

import numpy
import matplotlib.pyplot as plt

from tslearn.generators import random_walks
from tslearn.preprocessing import TimeSeriesScalerMeanVariance
from tslearn import metrics


numpy.random.seed(0)
n_ts, sz, d = 2, 100, 1
dataset = random_walks(n_ts=n_ts, sz=sz, d=d, random_state=5)
scaler = TimeSeriesScalerMeanVariance(mu=0., std=1.)  # Rescale time series
dataset_scaled = scaler.fit_transform(dataset)

lcss_path, sim_lcss = metrics.lcss_path(dataset_scaled[0, :, 0], dataset_scaled[1, :40, 0], eps=1.5)
dtw_path, sim_dtw = metrics.dtw_path(dataset_scaled[0, :, 0], dataset_scaled[1, :40, 0])

plt.figure(1, figsize=(8, 8))

plt.plot(dataset_scaled[0, :, 0], "b-", label='First time series')
plt.plot(dataset_scaled[1, :40, 0], "g-", label='Second time series')

for positions in lcss_path:
    plt.plot([positions[0], positions[1]],
             [dataset_scaled[0, positions[0], 0], dataset_scaled[1, positions[1], 0]], color='orange')
plt.legend()
plt.title("Time series matching with LCSS")

plt.figure(2, figsize=(8, 8))
plt.plot(dataset_scaled[0, :, 0], "b-", label='First time series')
plt.plot(dataset_scaled[1, :40, 0], "g-", label='Second time series')

for positions in dtw_path:
    plt.plot([positions[0], positions[1]],
             [dataset_scaled[0, positions[0], 0], dataset_scaled[1, positions[1], 0]], color='orange')

plt.legend()
plt.title("Time series matching with DTW")

plt.tight_layout()
plt.show()

脚本总运行时间: (0 分钟 2.635 秒)

Gallery generated by Sphinx-Gallery