当前位置:首页 > JavaScript

DTW JS实现

2026-03-02 05:06:20JavaScript

DTW算法简介

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

DTW JS实现

DTW的JavaScript实现

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

DTW JS实现

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绘制路径点连线

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

标签: DTWJS
分享给朋友:

相关文章

JS如何调用react组件

JS如何调用react组件

调用React组件的常见方法 在JavaScript中调用React组件通常涉及以下几种场景和方式: 直接渲染组件 通过ReactDOM.render()方法将组件渲染到DOM节点: import…

JS实现日期滚动选择

JS实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含年…

JS实现勋章

JS实现勋章

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

动态实现JS

动态实现JS

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

JS原子锁实现

JS原子锁实现

实现原子锁的方法 使用JavaScript的Atomics对象和SharedArrayBuffer可以实现原子锁。Atomics提供了一组静态方法用于对SharedArrayBuffer进行原子操作,…

JS实现隐藏tr

JS实现隐藏tr

隐藏表格行(tr)的方法 在JavaScript中隐藏表格行(tr)可以通过多种方式实现,以下是几种常见方法: 方法1:修改style.display属性 // 通过ID获取行并隐藏…