【问题标题】:Downsampling Time Series: Average vs Largest-Triangle-Three-Buckets下采样时间序列:平均与最大三角形三桶
【发布时间】:2018-07-18 08:17:41
【问题描述】:

我正在使用 Flot Charts 编写折线图来显示时间序列。

为了减少要显示的点数,我通过对同一小时内的每个数据点应用平均函数来进行下采样。

最近,我发现了最大三角形三桶算法: http://flot.base.is/

  1. 使用此类算法与使用简单函数(如平均值(每分钟、每小时、每天...)之间有什么区别?

  2. 为了加快长周期查询,在服务器端预先计算一个 sql 表是否有意义,通过对每个月的数据应用 LTTB,并让客户端在汇总数据?

【问题讨论】:

  • 链接到您链接的页面中的Master's thesis 详细说明了 LTTB 算法的工作原理,并且与简单的平均函数不同。第23页专门使用伪代码来演示算法。

标签: javascript graph average flot downsampling


【解决方案1】:

1:就我的目的而言,平均值的问题在于它们会消除样本之间的巨大差异——我的峰值和谷值比它们之间发生的情况更重要。 3buckets 算法的重点是尝试保留那些拐点(峰值/谷值),而不用担心总是显示数据相似或相同。

因此,在我的情况下,数据通常都是相同的(或足够接近 - 温度数据),直到样本 X 在图中显示小的 % 变化很重要,桶算法是完美的.

此外,由于桶算法是参数化的,您可以更改值(要保留多少数据)并查看哪些值在视觉上几乎相同的情况下核对最多的数据,并决定您可以在图表之前分配多少数据删除了太多数据。

天真的方法是抽取(从 N 个样本中删除 X),但如果是您关心的异常值并且算法核对异常值会发生什么?所以然后你改变你的抽取,这样如果差异太大,那么它就不会破坏那个样本。这是该概念的一种更复杂的版本。

2:取决于您计算所有数据的速度、数据是否发生变化以及各种其他因素。随你(由你决定。从我的角度来看,一旦我的数据是过去的,并且“选择”了一个样本来代表存储桶的值,它就不会被更改,我可以保存它并且不再重新计算。

既然你的问题有点老了,你最后做了什么?

【讨论】:

  • 非常感谢,解释清楚。关于第二季度,目前 LTTB 仍然在原始数据上动态应用。但是,如果客户端请求大周期(百万数据点),则可能需要几秒钟才能完成。当然,理想的情况是在几秒钟内渲染所有图形。我使用批处理,每天处理整个数据集,并且可以快速进行计算。因此,就我而言,在我的数据集的每个时间序列上预先计算 LTTB 听起来是个好主意,但不清楚要应用的 LTTB 采样参数,因为每个时间序列都有不同的范围。您如何处理?
  • 尽可能提前计算绝对是最好的主意。在我的例子中,我生成了大约 400k 的 JSON,我能够将它降低到大约 6k,而数据没有明显的差异,即使是很小的差异(1-2% 的偏差)也很好。如果我是你,我会获取一个示例实现并使用它来处理你的数据,调整参数(主要是存储桶大小),直到它看起来像是大小和数据视觉保真度之间的良好折衷......我的数据需要一切以 24 小时滑动窗口为基础,所以我只是从原始论文中手动实现它。
  • 谢谢,令人印象深刻的结果。据我所知,LTTB 从每个存储桶中挑选“最佳”数据点。我有与“flot.base.is”相同的实现(服务器端),所以我可以配置一个阈值(输出数据点的最大数量),但我不能直接调整桶大小。我的问题是我有多个周期长度的时间序列(2018 年 1 月至 2018 年 12 月,1910 年 1 月至 2019 年 1 月等),所以基本上我无法预先计算具有恒定阈值的 LTTB。您认为对于我的数据集中的每个时间序列,将 LTTB 与周期长度相关的动态阈值应用是一个好主意吗?
  • 不确定,最终的问题是算法不能告诉你什么最适合你的情况,你必须运行它,绘制它,确定你是否可以摆脱更多的数据。 .. 对我来说,关键问题是我们不会失去拐点,而且它在这种情况下确实非常有效。我会玩它。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2020-02-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2019-03-31
相关资源
最近更新 更多