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

如何创建成对DTW(动态时间规整)代价矩阵?Python代码生成全inf矩阵问题排查求助

解决成对DTW代价矩阵全为inf的问题

嘿,我帮你瞅了瞅这段DTW代码,问题还挺明显的,难怪输出全是无穷大!咱们一步步捋清楚问题出在哪,再给你修正后的代码:

你的代码里的核心问题

  • 初始化逻辑错误:你一开始把整个cost_matrix都设成了inf,但DTW的起点(也就是矩阵的(0,0)位置)应该是两个序列第一个元素的距离,而不是无穷大。而且你完全没计算x和y对应位置的距离——这可是DTW的核心啊,每一步的代价应该是当前点的距离加上之前路径的最小代价!
  • 边界处理缺失:DTW的第一行和第一列是特殊的边界:第一行只能从左边的元素累加(对应插入操作),第一列只能从上方的元素累加(对应删除操作)。你直接从i=1和j=1开始循环,完全没处理这部分,导致边界全是inf,后面的计算自然也跟着变成inf了。
  • 路径代价逻辑搞反:你写的dtw_cost = cost_matrix[-1,-1]完全不对,这是取矩阵最后一个元素的值,刚开始循环的时候它还是inf,把inf加到后续计算里,结果肯定还是inf。正确的逻辑应该是先算当前点的距离,再加上左、上、对角线三个方向的最小代价。

修正后的代码

import numpy as np

def calc_pairwise_dtw_cost(x, y):
    # 获取两个序列的长度
    len_x, len_y = len(x), len(y)
    # 用inf初始化代价矩阵,方便后续取最小值操作
    cost_matrix = np.full((len_y, len_x), float('inf'))
    
    # 设置DTW的起点:第一个元素的距离
    cost_matrix[0, 0] = np.abs(x[0] - y[0])
    
    # 处理第一列:只能从上方累加(对应删除操作)
    for i in range(1, len_y):
        cost_matrix[i, 0] = cost_matrix[i-1, 0] + np.abs(x[0] - y[i])
    
    # 处理第一行:只能从左方累加(对应插入操作)
    for j in range(1, len_x):
        cost_matrix[0, j] = cost_matrix[0, j-1] + np.abs(x[j] - y[0])
    
    # 填充矩阵的其他位置
    for i in range(1, len_y):
        for j in range(1, len_x):
            # 计算当前两个元素的距离代价
            current_point_cost = np.abs(x[j] - y[i])
            # 取三种可能路径的最小代价,加上当前点的距离
            cost_matrix[i, j] = current_point_cost + min(
                cost_matrix[i-1, j],    # 插入:从上方移动到当前位置
                cost_matrix[i, j-1],    # 删除:从左方移动到当前位置
                cost_matrix[i-1, j-1]   # 匹配:从对角线移动到当前位置
            )
    
    return cost_matrix

测试一下

用两个简单的序列测试,比如:

x = [1, 2, 3, 4]
y = [1, 3, 5]
print(calc_pairwise_dtw_cost(x, y))

你会得到正常的代价矩阵,再也不是全inf啦!

内容的提问来源于stack exchange,提问作者Blueboots

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:08:13