簡體   English   中英

用Java采樣數值數組

[英]Sampling numerical arrays in java

我有一個要在折線圖上顯示的時間序列數據的數據集。 數據當前存儲在oracle表中,並且數據以1點/秒的速度采樣。 問題是如何在6個月的時間內繪制數據? 從oracle返回數據后,是否有一種方法可以對數據進行下采樣(可以在各種圖表中完成,但是我不想在網絡上移動數據)? 例如,如果查詢返回10K點,如何將其采樣到1K點,並且仍然具有折線圖並保持10K點的視覺特征(峰/谷)?

我看着apache commons,但不知道確切的統計名稱是什么,我有點茫然。

我采樣的數據確實是時間序列數據,例如頁面點擊數。

聽起來您想要將10K數據點分割成1K個存儲桶-這些存儲桶中每個存儲桶的值可能是對您的數據有意義的任何統計計算(對不起,沒有實際上下文,這很難說) ,如果要發現數據趨勢,則可能需要使用中位數百分位數來總結每個存儲桶中的10個點。 Apache Commons Math具有幫助功能。 然后,使用1K降采樣的數據點,可以繪制圖表。

例如,如果我有1萬個頁面加載時間的數據點,則可以通過對每10個點進行中值來將其映射到1K數據點-這將告訴我該范圍內最常見的加載時間-並指出該點。 或者,也許我可以使用Max查找該時間段內的最大加載時間。

有兩種選擇:您可以按照@Adrian Pang的建議進行操作,並使用時間倉,這意味着它們之間有倉位和硬邊界。 這非常好,如果您正在使用時間序列,則稱為下采樣。

您還可以通過對點應用滑動窗口平均值/函數卷積來使用平滑箱定義。 這將為您提供與原始采樣率相同的采樣率的時間序列,但更加平滑。 滑動窗口平均值(窗口中所有點的平均值/中位數,加權平均值相等)和高斯卷積(加權平均值來自權重密度曲線的加權平均值)就是突出的例子。

我的建議是在較短的時間間隔內取平均值。 使較短間隔的長度取決於整個時間范圍。 如果整個時間范圍足夠短,則僅顯示原始數據。 例如:

  • 總體= 1年:讓子間隔= 1天
  • 總體= 1個月:讓子間隔= 1小時
  • 總體= 1天:讓子間隔= 1分鍾
  • 總體= 1小時:無平均,僅使用原始數據

您將不得不選擇從一個子間隔轉換到另一個子間隔的位置,例如,對於整個= 5個月,該子間隔= 1天還是1小時?

我的建議是制定一個簡單的方案,以便其他人容易理解。 請記住,繪圖的目的是幫助其他人(而不是您)理解數據。 一個簡單的平均方案將幫助您達到該目標。

如果您需要的只是減少可視化的要點而又不丟失任何可視化信息,建議您在此處使用代碼。 這種方法的棘手部分是找到正確的閾值。 其中,閾值是您要降低采樣后的目標數據點數量。 閾值越小,丟失的視覺信息越多。 但是,從10K到1K,是可行的,因為我已經用相似數量的數據進行了嘗試。

附帶說明一下,您應該牢記

  • 可視化的質量取決於圖表的點數和大小(以像素為單位)。 這意味着對於更大的圖表,您需要更多的數據。
  • 如果對下采樣數據應用任何進一步的分析,許多分析都不會返回校正結果。 或者至少我還沒有見過任何證明相反的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM