在java中采样数值数组

时间:2014-05-14 20:18:28

标签: java statistics

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

我查看了apache的公地但却不知道具体的统计名称是什么,我有点不知所措。

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有两种选择:你可以像@Adrian Pang那样建议并使用时间仓,这意味着你们之间有垃圾箱和硬边界。这非常好,如果您正在使用时间序列,则称为下采样。<​​/ p>

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

答案 2 :(得分:0)

我的建议是在较短的时间间隔内对值进行平均。使较短间隔的长度取决于整个时间范围。如果总时间范围足够短,只需显示原始数据。 E.g:

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

你必须做出一些选择,从一个子区间转移到另一个子区间,例如,整体= 5个月,子区间= 1天还是1小时?

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

答案 3 :(得分:0)

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

作为旁注,你应该记住

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