You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中如何实现sliding window与DTW完成多变量时序图匹配

多变量时间序列滑动窗口+DTW图匹配实现参考

下面是可直接复用的实现逻辑,覆盖从时序切分、DTW距离计算到图构建的全流程,适配多变量时序场景:

核心实现流程

  • 滑动窗口切分:按设定的窗口长度、滑动步长把原始长时序切为固定长度的子序列窗口,常规场景推荐30%~50%的窗口重叠率,避免时序特征被切断
  • 多变量DTW距离计算:逐对计算窗口间的DTW距离,点间度量可根据数据特性选欧氏距离、加权欧氏距离或马氏距离
  • 图结构构建:将每个窗口作为图节点,节点间DTW距离低于预设阈值时连边,边权为对应的DTW距离值,后续可直接在该图结构上开展各类图匹配任务

可运行代码示例

import numpy as np
from typing import Tuple, List

def multivariate_dtw(s1: np.ndarray, s2: np.ndarray) -> float:
    """
    计算两个多变量时间序列窗口的DTW距离
    入参s1、s2形状均为(窗口长度, 变量数)
    """
    n, m = len(s1), len(s2)
    dtw_matrix = np.full((n + 1, m + 1), np.inf)
    dtw_matrix[0, 0] = 0

    for i in range(1, n + 1):
        for j in range(1, m + 1):
            # 多变量点距默认用各变量欧氏距离和,可按需替换为其他度量
            point_dist = np.sqrt(np.sum((s1[i-1] - s2[j-1]) ** 2))
            dtw_matrix[i, j] = point_dist + np.min([
                dtw_matrix[i-1, j],
                dtw_matrix[i, j-1],
                dtw_matrix[i-1, j-1]
            ])
    return dtw_matrix[n, m]

def sliding_window_split(ts: np.ndarray, window_size: int, step: int) -> List[np.ndarray]:
    """
    滑动窗口切分多变量时序
    入参ts形状为(总时序长度, 变量数)
    """
    windows = []
    total_len = len(ts)
    for start in range(0, total_len - window_size + 1, step):
        windows.append(ts[start:start + window_size])
    return windows

def build_similarity_graph(windows: List[np.ndarray], dist_threshold: float) -> Tuple[List[int], List[Tuple[int, int, float]]]:
    """
    基于DTW距离构建相似度图
    返回节点列表、带权边列表(起点id, 终点id, 边权=DTW距离)
    """
    nodes = list(range(len(windows)))
    edges = []
    for i in range(len(windows)):
        for j in range(i + 1, len(windows)):
            dtw_dist = multivariate_dtw(windows[i], windows[j])
            if dtw_dist < dist_threshold:
                edges.append((i, j, dtw_dist))
    return nodes, edges

# 调用示例
if __name__ == "__main__":
    # 模拟3变量、长度1000的多变量时序
    mock_ts = np.random.randn(1000, 3)
    # 切分窗口:窗口长度50,步长25(50%重叠率)
    window_list = sliding_window_split(mock_ts, window_size=50, step=25)
    # 构建相似度图:距离阈值需提前采样部分窗口计算距离分布后确定,示例暂设为10
    nodes, edges = build_similarity_graph(window_list, dist_threshold=10)

落地注意事项

  • 性能优化:原生DTW时间复杂度为O(n²),窗口量级较大时可给计算逻辑加JIT编译加速,或引入LB_Keogh等DTW下界方法做剪枝,提前过滤距离必然超过阈值的窗口对,减少冗余计算
  • 图匹配适配:如果是做跨时序的图匹配,可直接将DTW距离的倒数作为节点相似度输入常规图匹配算法;如果是做子图匹配,可先将查询模式按相同窗口规则切分计算特征,再到目标图中检索匹配子结构
  • 度量调整:如果不同变量的重要性有差异,可在点距计算环节给各变量分配对应权重,不要默认所有变量权重一致

内容的提问来源于stack exchange,提问作者Rosita binti Husain Faculty o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:18:22