使用fastdtw计算变长多维数组相似度报错及解决方案咨询
错误原因
你遇到的报错根本原因有两层:
- 你传入的数据集是不规则嵌套结构(子数组长度不一致),直接转
np.array时numpy无法生成标准的同维度数值数组,本身就会抛出警告/错误 - fastdtw默认使用的欧氏距离仅支持计算两个长度相同的向量的距离,无法处理长度不等的子数组的距离计算
fastdtw适配方案
fastdtw本身支持自定义距离函数,你不需要用默认的欧氏距离,自己实现一个适配变长子数组的距离度量传入dist参数即可,同时不需要提前把不规则数组转为numpy数组,直接传入原生列表即可运行,示例代码如下:
from fastdtw import fastdtw import numpy as np # 自定义变长数组距离计算函数,可根据你的业务需求替换为其他度量 def variable_len_dist(arr1, arr2): # 示例方案:将两个数组补零到相同长度后计算欧氏距离 max_len = max(len(arr1), len(arr2)) pad1 = np.pad(np.array(arr1, dtype=np.float64), (0, max_len - len(arr1)), constant_values=0) pad2 = np.pad(np.array(arr2, dtype=np.float64), (0, max_len - len(arr2)), constant_values=0) return np.linalg.norm(pad1 - pad2) dataSetI = [[1, 0.5], [2, 2], []] dataSetII = [[1, 1,3,5], [1, 0.51], [2, 1,5,6,7]] distance, path = fastdtw(dataSetI, dataSetII, dist=variable_len_dist) print(distance)
替代工具推荐
如果你的需求更复杂,也可以用以下工具库实现同类需求:
dtw-python:比fastdtw功能更完善的DTW实现,支持自定义约束、多尺度匹配,对变长特征的适配性更好tslearn:专门处理时序数据的工具库,内置了支持不等长序列的DTW、Soft-DTW等多种相似度度量,不需要手动实现距离函数,调用更便捷
内容的提问来源于stack exchange,提问作者frankie lee
相关产品推荐
相关产品推荐

