当前位置:首页 > JavaScript

DTW JS实现

2026-03-02 05:06:20JavaScript

DTW算法简介

动态时间规整(Dynamic Time Warping, DTW)是一种用于衡量两个时间序列相似性的算法,尤其适用于不同长度或局部速度不一致的序列比对。其核心思想是通过动态规划找到最小累积距离的路径。

DTW的JavaScript实现

以下是一个完整的DTW算法实现,包含距离计算和路径回溯功能:

function dtw(series1, series2, distanceFn = (a, b) => Math.abs(a - b)) {
    const m = series1.length;
    const n = series2.length;

    // 初始化距离矩阵
    const costMatrix = Array(m + 1).fill().map(() => Array(n + 1).fill(Infinity));
    costMatrix[0][0] = 0;

    // 填充距离矩阵
    for (let i = 1; i <= m; i++) {
        for (let j = 1; j <= n; j++) {
            const cost = distanceFn(series1[i - 1], series2[j - 1]);
            costMatrix[i][j] = cost + Math.min(
                costMatrix[i - 1][j],    // 插入
                costMatrix[i][j - 1],    // 删除
                costMatrix[i - 1][j - 1] // 匹配
            );
        }
    }

    // 回溯最优路径
    let i = m, j = n;
    const path = [[i - 1, j - 1]];
    while (i > 1 || j > 1) {
        const minVal = Math.min(
            costMatrix[i - 1][j] ?? Infinity,
            costMatrix[i][j - 1] ?? Infinity,
            costMatrix[i - 1][j - 1] ?? Infinity
        );
        if (minVal === costMatrix[i - 1][j - 1]) {
            i--;
            j--;
        } else if (minVal === costMatrix[i - 1][j]) {
            i--;
        } else {
            j--;
        }
        path.push([i - 1, j - 1]);
    }

    return {
        distance: costMatrix[m][n],
        path: path.reverse()
    };
}

使用示例

const seriesA = [1, 3, 4, 9, 8];
const seriesB = [1, 2, 3, 4, 5];

const result = dtw(seriesA, seriesB);
console.log("DTW距离:", result.distance);
console.log("对齐路径:", result.path);

关键点说明

  1. 距离函数:默认使用欧氏距离(绝对值),可通过参数自定义(如余弦相似度)。
  2. 时间复杂度:O(mn),适用于中小规模序列。
  3. 优化建议
    • 添加窗口约束(如Sakoe-Chiba Band)限制搜索范围。
    • 对于长序列,考虑FastDTW等近似算法。

可视化扩展

结合库如D3.js可绘制对齐路径:

const pathPoints = result.path.map(([i, j]) => ({ x: i, y: j }));
// 使用D3绘制路径点连线

此实现可直接用于时间序列分类、语音识别等场景。

DTW JS实现

标签: DTWJS
分享给朋友:

相关文章

JS如何实现左右滑动

JS如何实现左右滑动

实现左右滑动的方法 使用 touchstart、touchmove 和 touchend 事件监听触摸操作,计算滑动距离和方向。 let startX, moveX; element.addEve…

JS节流和防抖的实现

JS节流和防抖的实现

节流(Throttle)的实现 节流是指在一定时间间隔内,函数最多执行一次。常用于限制高频事件的触发频率,如滚动事件、窗口调整等。 function throttle(func, delay) {…

JS实现ln

JS实现ln

在JavaScript中实现自然对数(ln)功能可以通过以下几种方式完成: 使用Math对象的原生方法 JavaScript内置的Math对象提供了Math.log()方法,该方法默认计算以自然对…

JS实现勋章

JS实现勋章

实现动态勋章效果 使用CSS和JavaScript创建动态旋转勋章。HTML部分定义勋章容器,CSS设置样式和动画,JavaScript控制交互行为。 <div class="badge-c…

动态实现JS

动态实现JS

动态实现 JavaScript 的方法 动态加载脚本 通过创建 script 元素并插入到 DOM 中实现动态加载。例如: const script = document.createElem…

JS实现取色

JS实现取色

使用 input[type="color"] 获取颜色值 HTML5 提供了原生颜色选择器,通过 <input type="color"> 可直接调用系统取色工具。用户选择的颜色会以十六进…