当前位置:首页 > 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可绘制对齐路径:

DTW 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如何实现左右滑动

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

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…

用JS实现冰墩墩

用JS实现冰墩墩

以下是用JavaScript绘制冰墩墩的几种实现方法,结合Canvas绘图和SVG路径数据: 使用Canvas绘制基础轮廓 const canvas = document.createElement…

JS节流和防抖的实现

JS节流和防抖的实现

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

JS实现GPS

JS实现GPS

GPS定位的基本原理 GPS定位主要通过浏览器提供的Geolocation API实现。该API允许网页获取用户设备的地理位置信息,前提是用户授权同意。位置信息通常来源于设备的GPS模块、Wi-Fi或…