Angular Metric for Shape Similarity(AMSS)的Python实现及近似方案咨询
关于Angular Metric for Shape Similarity(AMSS)的Python实现与近似方案
1. 优化的AMSS官方Python实现现状
目前没有被广泛认可的、经过工程优化的官方AMSS Python实现。AMSS的核心定义来自学术研究,开源生态里尚未有专门针对它的成熟库实现。
2. 用导数+DTW+余弦相似度近似AMSS的可行性
完全可行,且这个思路精准贴合AMSS的核心设计逻辑:
- AMSS本质是衡量两条曲线的形状角度相似性,核心关注曲线的方向变化(导数)而非原始数值的绝对值;
- 用导数序列表征曲线的局部方向特征,正好匹配AMSS对形状角度信息的提取需求;
- 余弦相似度用于衡量两个导数向量的方向一致性,完美对应AMSS的角度相似性度量目标;
- DTW(动态时间规整)解决了两条序列在时间轴上不对齐的问题,这也是形状相似性度量中的常见场景。
3. 你提供的代码是否为AMSS的良好近似
你的实现抓住了AMSS的核心要素,是一个合格的近似方案,但有几个细节可以优化,让它更贴近AMSS的原始定义:
- 数值导数的稳定性:
np.gradient对噪声敏感,若输入序列存在噪声,建议先对原始序列做平滑处理(比如scipy.signal.savgol_filter),再计算导数; - DTW路径约束:原始AMSS可能对序列对齐的路径有局部约束(比如限制相邻点的斜率),你可以给DTW添加窗口约束(比如Sakoe-Chiba窗口),通过
dtw_path_from_metric的global_constraint参数实现; - 度量归一化:
distance.cosine返回的是1 - 余弦相似度,范围是[0,2],最终的DTW距离是该值的累积和。若需要和AMSS原始度量的范围对齐,可对结果做归一化处理(比如除以序列长度)。
优化后的示例代码(添加平滑和窗口约束):
import numpy as np from tslearn.metrics import dtw_path_from_metric from scipy.spatial import distance from scipy.signal import savgol_filter def smoothed_gradient(x, window_length=5, polyorder=2): # 先平滑再计算导数,提升稳定性 smoothed_x = savgol_filter(x, window_length, polyorder) return np.gradient(smoothed_x) def amss_improved(x, y): dx = smoothed_gradient(x) dy = smoothed_gradient(y) # 添加Sakoe-Chiba窗口约束,窗口大小设为序列长度的10% window_size = max(len(dx), len(dy)) // 10 return dtw_path_from_metric(dx, dy, metric=distance.cosine, global_constraint="sakoe_chiba", sakoe_chiba_radius=window_size)[1]
内容的提问来源于stack exchange,提问作者hfaila
相关产品推荐
相关产品推荐

