簡體   English   中英

C ++累加器庫,能夠刪除舊樣本

[英]C++ accumulator library with ability to remove old samples

在Boost.Accumulator中,您可以將樣本添加到累加器,然后從中提取統計量。 例如:

acc(1.)
acc(2.)
acc(3.)
cout << mean; // 2

該庫具有許多更復雜的統計量,例如skewnesskurtosisp_square_cumulative_distribution

我想做的是這樣的事情:

acc(1.)
acc(2.)
acc(3.)
std::cout << mean(acc); // 2
acc.pop() // withdraw the first value (1.)
std::cout << mean(acc); // 2.5

pop()將以FIFO(先進先出)方式工作。 我想要做的是在滑動時間窗口內以在線(增量)方式計算我的數據的統計數據。

累加器必須在內部保留所有值。

我可以自己做,但我總是首先檢查現有的庫,並且可能有一些算法,我不知道在數據傳入或傳出時巧妙地計算數量。

由於您提到了“滑動時間窗口”,因此一個選項是使用滾動平均值(還有滾動總和和滾動計數),這是最后N個樣本的平均值。 根據您的需要,您可以創建具有不同窗口大小的單獨累加器。

typedef accumulator_set<double,
                stats<tag::rolling_mean>
                > my_accumulator;

my_accumulator acc(tag::rolling_window::window_size = 3);
acc(1.);
acc(2.);
acc(3.);
std::cout << rolling_mean(acc);
// Reset accumulator and use different window size
acc = my_accumulator(tag::rolling_window::window_size = 2);
acc(2.);
acc(3.);
std::cout << rolling_mean(acc);

另外,如果你看看這些的實現,他們使用boost/circular_buffer.hpp

您可能需要將所有樣本保存在向量中,然后從每個計算的向量中累積它們。 這樣的事情: https//stackoverflow.com/a/7616783/219136

您可能希望將數據存儲在std::deque而不是vector中,因此插入和刪除都可能具有恆定的復雜性。 如果使用矢量,則不可避免地會是線性的。

除此之外,將算法應用於集合非常簡單。 然而,奇怪的是,我不知道已經編寫和測試過的這類算法的集合,盡管看起來像一組相當明顯的算法可用。

對於它的價值,構建一個適配器將數據從集合提供給累加器來計算你可以得到的統計數據是相當簡單的。 在少數情況下,累加器可能需要做一些額外的工作來逐步計算結果,但我猜這很少會失去足夠的效率來關注。

暫無
暫無

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

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