【问题标题】:Sampling numerical arrays in java在java中对数值数组进行采样
【发布时间】:2014-07-03 01:55:11
【问题描述】:

我有一组时间序列数据,我想在折线图上显示。数据当前存储在oracle表中,数据以1点/秒的速度采样。问题是如何绘制 6 个月内的数据?一旦从 oracle 返回数据,有没有办法对数据进行下采样(这可以在各种图表中完成,但我不想通过网络移动数据)?例如,如果一个查询返回 10K 点,我怎样才能将其下采样到 1K 点,并且仍然具有折线图并保持 10K 点的视觉特征(峰/谷)?

我查看了 apache commons,但不知道确切的统计名称是什么,我有点不知所措。

我采样的数据确实是时间序列数据,例如页面点击量。

【问题讨论】:

  • 我建议您阅读以下论文“M4: A VisualizationOriented Time Series Data Aggregation”它可能会给您一些替代方案,它描述了一种用于 losseles(就呈现的可视化而言)数据点的方法减少。这是在您使用 sql 查询检索数据时完成的。

标签: java statistics


【解决方案1】:

听起来您想要将 10K 数据点分割成 1K 个桶——每个桶的值可能是对您的数据有意义的任何统计计算(抱歉,没有实际上下文很难说) 例如,如果您想发现数据的趋势,您可能需要使用 Median Percentile 来汇总每个桶中的 10 个点。 Apache Commons Math 有帮助函数。然后,使用 1K 下采样数据点,您可以绘制图表。

例如,如果我有 10K 个数据点的页面加载时间,我可能会通过对每 10 个点做一个中值来将其映射到 1K 个数据点——这将告诉我该范围内最常见的加载时间——并且指出这一点。或者,也许我可以使用 Max 来找到该期间的最大加载时间。

【讨论】:

    【解决方案2】:

    有两种选择:您可以按照@Adrian Pang 的建议进行操作并使用时间箱,这意味着您有时间箱和它们之间的硬边界。这非常好,如果您使用的是时间序列,则称为下采样。

    您还可以通过对点应用滑动窗口平均值/函数卷积来使用平滑 bin 定义。这将为您提供与原始采样率相同的时间序列,但更平滑。突出的例子是滑动窗口平均值(窗口中所有点的平均值/中值,加权平均值)和高斯卷积(权重来自高斯密度曲线的加权平均值)。

    【讨论】:

      【解决方案3】:

      我的建议是在较短的时间间隔内平均这些值。使较短间隔的长度取决于整个时间范围。如果整体时间范围足够短,则只显示原始数据。例如:

      • 总体 = 1 年:设 subinterval = 1 天
      • 总体 = 1 个月:让 subinterval = 1 小时
      • 总体 = 1 天:让子间隔 = 1 分钟
      • 总体 = 1 小时:没有平均,只使用原始数据

      您将不得不就从一个子间隔转换到另一个子间隔的位置做出一些选择,例如,对于整体 = 5 个月,子间隔是 = 1 天还是 1 小时?

      我的建议是制定一个简单的方案,以便其他人容易理解。请记住,绘图的目的是帮助其他人(而不是您)理解数据。一个简单的平均方案将帮助您实现该目标。

      【讨论】:

        【解决方案4】:

        如果您只需要在不丢失任何视觉信息的情况下减少可视化点数,我建议使用代码here。这种方法的棘手部分是找到正确的阈值。其中阈值是您在下采样后目标拥有的数据点数量。阈值越小,您丢失的视觉信息就越多。但是从 10K 到 1K 是可行的,因为我已经用相似数量的数据进行了尝试。

        作为旁注,您应该牢记

        • 可视化质量取决于图表的点数和大小(以像素为单位)。这意味着对于更大的图表,您需要更多的数据。
        • 如果应用于下采样数据,任何进一步的分析都不会返回更正的结果。或者至少我没有看到任何人证明相反的情况。

        【讨论】:

          猜你喜欢
          • 2012-03-10
          • 1970-01-01
          • 2017-06-12
          • 1970-01-01
          • 2013-12-17
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 2012-06-06
          相关资源
          最近更新 更多