You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求推荐可识别时间序列图重复形状的Python工具包(含指定匹配功能)

适合时间序列重复形状识别的Python工具包推荐

我推荐几个非常贴合你需求的Python工具包——它们都能帮你根据给定的子序列(指定起始索引和长度),找出时间序列中形状相似的重复模式,并返回它们的位置和尺寸信息:

1. tslearn(首选)

这是专门为时间序列分析设计的库,子序列匹配功能简直是为你的需求量身定做的。它内置了基于动态时间规整(DTW)的子序列搜索工具,既能高效计算序列相似度,又能轻松定位相似子序列的位置。

快速上手示例:

假设你有一个时间序列数组,目标子序列是从start_idx开始、长度为subseq_len的片段:

from tslearn.metrics import dtw_subsequence_path
import numpy as np

# 示例时间序列
time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2])
start_idx = 0
subseq_len = 3
target_subseq = time_series[start_idx:start_idx+subseq_len]

# 遍历所有可能的子序列,筛选相似项
similar_subseqs = []
for i in range(len(time_series) - subseq_len + 1):
    current_subseq = time_series[i:i+subseq_len]
    # 计算DTW距离(值越小越相似)
    dtw_dist, _ = dtw_subsequence_path(target_subseq, current_subseq)
    # 自定义相似度阈值,这里设为0.5
    if dtw_dist < 0.5:
        similar_subseqs.append({
            "start_index": i,
            "length": subseq_len,
            "dtw_distance": dtw_dist
        })

print("找到的相似子序列:", similar_subseqs)

tslearn还提供了更高效的批量搜索API,比如KNeighborsTimeSeries相关工具,适合处理大规模时间序列数据。

2. dtw-python

如果你需要对DTW算法有更精细的控制,dtw-python是个轻量又灵活的选择。它专注于DTW的底层实现,能精准计算两个序列的相似度,你可以基于它封装自己的子序列匹配逻辑。

示例片段:

from dtw import dtw
import numpy as np

time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2])
target_subseq = time_series[0:3]
subseq_len = len(target_subseq)

similar_positions = []
for i in range(len(time_series) - subseq_len + 1):
    candidate = time_series[i:i+subseq_len]
    # 用欧氏距离作为DTW的局部距离度量
    dist, _, _, _ = dtw(target_subseq, candidate, dist=lambda x, y: np.linalg.norm(x-y))
    # 筛选距离小于0.3的相似子序列
    if dist < 0.3:
        similar_positions.append({
            "start_idx": i,
            "length": subseq_len,
            "similarity_score": 1/(1+dist)  # 转换为0-1的相似度得分
        })

print("相似子序列位置:", similar_positions)

3. Scikit-learn + 滑动窗口

如果你已经在使用scikit-learn的生态栈,可以结合滑动窗口提取子序列特征,再用相似度匹配(比如余弦相似度)来找到重复模式。这里可以用skimage.util.view_as_windows快速生成所有滑动窗口子序列:

示例:

from sklearn.metrics.pairwise import cosine_similarity
from skimage.util import view_as_windows
import numpy as np

# 注意要把时间序列转成二维数组(适配scikit-learn的输入格式)
time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2]).reshape(-1, 1)
subseq_len = 3
target_subseq = time_series[0:3]

# 生成所有滑动窗口子序列
windows = view_as_windows(time_series, window_shape=(subseq_len, 1), step=1).squeeze()

# 计算目标子序列与所有窗口的余弦相似度
similarities = cosine_similarity(target_subseq.T, windows.T)[0]

# 筛选相似度高于0.95的子序列
threshold = 0.95
similar_indices = np.where(similarities >= threshold)[0]

similar_results = [{"start_index": idx, "length": subseq_len, "similarity": sim} 
                   for idx, sim in zip(similar_indices, similarities[similar_indices])]

print("相似子序列:", similar_results)

选择建议:

  • 如果你是做专业时间序列分析,优先选tslearn,它封装了大量现成工具,能帮你少写很多重复代码。
  • 若需要对DTW算法进行定制化调整,dtw-python会更灵活。
  • 如果你已经在使用scikit-learn,第三种方法可以无缝融入你的现有工作流。

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

火山引擎 最新活动