如何创建成对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
相关产品推荐
相关产品推荐

