不定期計算 EWMA 的線上算法?
什麼是用於計算以不規則間隔觀察到的輸入變數的 EWMA(指數加權移動平均值)的快速線上算法?
我知道定期採樣時的公式:
從半衰期計算 alpha:
$$ \alpha = 1 - e^{\frac{\ln{.5}}{H}} $$ 計算 x 的 EWMA:
$$ E = \alpha\cdot x + (1-\alpha)\cdot E_{-1} $$ 在採樣間隔不規則的情況下執行相同操作的算法是什麼?
編輯:
我在網上找到了一種算法,聲稱可以實現不規則的 EWMA。
double operator()(double x) { if (isnan(prev_ewma_)) // we don't decay the first sample { prev_ewma_ = x; prev_time_ = Time::now(); return x; } double time_decay = Time::now() - prev_time_; double alpha = 1 - std::exp(-time_decay / halflife_); double ewma = alpha * x + (1 - alpha) * prev_ewma_; prev_ewma_ = ewma; prev_time_ = now; return ewma; }
這個算法正確嗎?
上面的不規則 EWMA 程式碼並沒有給出半衰期 - 程式碼缺少 $ e^{\ln(.5)} $ 上式中找到的項。要獲得真正的半衰期,程式碼應如下所示:
double operator()(double x) { if (isnan(prev_ewma_)) // we don't decay the first sample { prev_ewma_ = x; prev_time_ = Time::now(); return x; } double time_decay = Time::now() - prev_time_; double alpha = 1 - std::exp(std::log(0.5) * time_decay / halflife_); double ewma = alpha * x + (1 - alpha) * prev_ewma_; prev_ewma_ = ewma; prev_time_ = now; return ewma; }
為了證明這是可行的,我們看看 alpha 在 EWMA 公式中是如何使用的。
$$ E = \alpha \cdot x + (1-\alpha) \cdot E_{-1} $$
我們預計在半衰期過去後,正好有一半 $ E_{-1} $ 將保留在我們的過濾值中。對於每個過濾時間步,剩餘的值 $ E_{-1} $ 將乘以 $ 1-\alpha $ , 意思是我們要解決 $ \alpha $ 這樣
$$ 0.5 = (1-\alpha)^N $$
在哪裡 $ N $ 是我們在半衰期中過濾的樣本數量。對於固定的時間步長 $ dt $ (程式碼中的time_decay),我們計算 $ N $ 作為
$$ N = \frac{H}{dt} $$
在哪裡 $ H $ 是半衰期。這給了我們
$$ 0.5 = (1-\alpha)^{\frac{H}{dt}} $$
插入我們的新公式 $ \alpha $ :
$$ \alpha = 1 - e^{\ln(0.5) \cdot \frac {dt} {H}} $$
$$ (e^{\ln(0.5)\cdot \frac {dt} {H}})^{\frac{H}{dt}} $$
$$ e^{\ln(0.5)} = 0.5 $$
將保留原始值的一半。
您計算兩個事件之間的不規則持續時間內的“單位間隔”的數量,並通過計數重複更新功能。攤銷時間是單位間隔的平均數。
在實際案例中,“單位間隔”更大(二次抽樣),因此這是在攤銷的常數時間內完成的。