理解tslearn中的最长公共子序列(LCSS)时间序列相似度度量
tslearn 项目地址: https://gitcode.com/gh_mirrors/tsl/tslearn
什么是LCSS?
最长公共子序列(Longest Common Subsequence, LCSS)是一种用于衡量两个时间序列相似度的算法。在时间序列分析领域,我们经常需要比较两个序列的相似程度,LCSS提供了一种有效的方法。
LCSS的核心思想是:找出两个时间序列中能够匹配的最长子序列,这里的"匹配"指的是两个序列点在某种距离度量下足够接近。与严格的对齐方式不同,LCSS允许序列在时间轴上有一定的弹性,这使得它特别适合处理时间序列中常见的时间偏移问题。
LCSS的基本原理
考虑两个时间序列:
- x = (x₀, ..., xₙ₋₁),长度为n
- y = (y₀, ..., yₘ₋₁),长度为m
其中每个xᵢ和yⱼ都是d维空间中的点。在tslearn中,这些时间序列会被表示为形状分别为(n, d)和(m, d)的数组。
LCSS的相似度分数S(x, y, ε)定义为:
S(x, y, ε) = LCSSε(x, y) / min(n, m)
其中ε是匹配阈值,决定了两个点被认为是"匹配"的最大距离。
在tslearn中使用LCSS
tslearn提供了简单易用的LCSS实现:
from tslearn.metrics import lcss, lcss_path
# 计算LCSS相似度分数
lcss_score = lcss(x, y)
# 如果需要获取匹配路径信息
path, lcss_score = lcss_path(x, y)
算法实现细节
LCSS使用动态规划方法实现,时间复杂度为O(n²)。算法核心思想是构建一个得分矩阵C,其中C[i,j]表示x的前i个元素和y的前j个元素之间的LCSS长度。
伪代码如下:
def lcss(x, y):
# 初始化
for i = 0..n
C[i, 0] = 0
for j = 0..m
C[0, j] = 0
# 主循环
for i = 1..n
for j = 1..m
if dist(x_i, x_j) <= epsilon:
C[i, j] = C[i-1, j-1] + 1
else:
C[i, j] = max(C[i, j-1], C[i-1, j])
return C[n, m] / min(n, m)
自定义距离度量
默认情况下,tslearn使用平方欧氏距离作为基础度量。如果需要使用其他距离度量,可以使用lcss_path_from_metric
函数:
from tslearn.metrics import lcss_path_from_metric
path, cost = lcss_path_from_metric(x, y, metric=custom_metric)
LCSS的性质
LCSS具有以下重要性质:
- 对于任意x,y,LCSS(x,y) ∈ [0,1]
- 对称性:LCSS(x,y) = LCSS(y,x)
- 自反性:LCSS(x,x) = 1
这些性质使得LCSS分数易于解释:1表示完全匹配,0表示完全不匹配。
添加约束条件
在实际应用中,我们常常需要对匹配路径施加一些约束,以避免不合理的对齐。
Sakoe-Chiba带约束
Sakoe-Chiba带约束限制路径不能偏离对角线太远,通过半径参数r控制:
cost = lcss(x, y, global_constraint="sakoe_chiba", sakoe_chiba_radius=3)
Itakura平行四边形约束
Itakura约束通过最大斜率s控制路径的对齐方式:
cost = lcss(x, y, global_constraint="itakura", itakura_max_slope=2.0)
应用场景
LCSS特别适用于以下场景:
- 轨迹匹配:如GPS轨迹比较
- 动作识别:比较不同速度下的人体动作
- 语音识别:处理不同语速的语音信号
- 生物信号分析:如ECG、EEG信号的比较
总结
tslearn中的LCSS实现提供了一种灵活而强大的时间序列相似度度量方法。通过调整匹配阈值ε和选择适当的约束条件,可以适应各种实际应用场景。理解LCSS的原理和实现细节有助于在实际项目中做出更合理的选择和调参。
对于时间序列分析任务,LCSS是一个值得掌握的强大工具,特别是当处理的时间序列可能存在时间偏移或不同长度时,它能提供比严格对齐方法更鲁棒的相似度评估。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考