【问题标题】:Time Series Segmentation using Python使用 Python 进行时间序列分割
【发布时间】:2021-10-28 15:32:08
【问题描述】:

我有一个 TimeSeries 数据集,其中包含如下所示的图。我正在尝试找到对时间序列进行分割的最佳方法。我需要将时间序列分为三个区域 - 'RampUp'、'Plateua' 和 'CoolDown' 分别用于初始斜坡上升部分、近似恒定部分和最终冷却部分。

对我将获得的未来系列进行此细分的最佳方法是什么?例如,如果我的模型被赋予这样的时间序列作为输入,它应该能够输出区域边界的索引吗?另外,这可以在无人监督的情况下进行吗?

感谢您的宝贵时间。非常感谢任何建议。

【问题讨论】:

  • 你试过什么?对我来说听起来是采样信号(时间序列数据)并将它们分为 3 类。这项工作可以以无监督的形式完成,例如将实例聚类为 3 个集群。另一个想法是使用集群/ML 方法生成时间间隔[a, b] 作为所需的段,或者我们称之为集群/类,具体取决于任务。
  • 这些帖子中有很多可用的讨论:post1post2,我发现了这个answer

标签: python time-series classification unsupervised-learning supervised-learning


【解决方案1】:

正如@mdgorgan 提供的那样,除了其他方法(基于机器学习的方法/黑客)之外,您还可以使用这种基于信号处理的方法来执行分割任务。我根据这个document尝试过:

#install library
#!python -m pip install ruptures

#import libraries
import matplotlib.pyplot as plt 
import ruptures as rpt  

#genearte sample data in form of a signal
n_samples, n_dims, sigma = 1000, 1, 1
n_bkps = 2  # number of breakpoints
signal, bkps = rpt.pw_constant(n_samples, n_dims, n_bkps, noise_std=sigma)
print(bkps) #[340, 671, 1000]

# detection
algo = rpt.Dynp(model="l2").fit(signal)
result = algo.predict(n_bkps=2)

print(result)
#[340, 670, 1000]

# display segmentation
rpt.display(signal, bkps, result)
plt.show()

它根据变化点检测进行分割工作。

【讨论】:

  • 您好,谢谢您的建议!我已经尝试过使用它,这是一个很好的起点。但它不能准确预测我在问题中显示的曲线的边界指数。我可以做些什么来提高准确性?
【解决方案2】:

这听起来像是一个可以通过变更点检测来解决的问题。

ruptures 库是开始离线方法的好地方:https://pypi.org/project/ruptures/

您将找到已知和未知数量的变更点的方法。

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2017-05-12
    • 2012-04-02
    • 2018-06-05
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多