Wykładnicza średnia krocząca Próbkowana w różnym czasie

Mam wartość ciągłą, dla której chciałbym obliczyć wykładniczą średnią ruchomą . Normalnie użyłbym do tego standardowej formuły:

  • S n = aY + (1-α) Sn-1

Gdzie S n to nowa średnia, α To Alfa, Y to próbka, A S n-1 to poprzednia średnia.

Niestety, z powodu różnych problemów nie mam spójnego czasu próbkowania. Może Wiem, że mogę spróbować co najwyżej, powiedzmy, raz na milisekunda, ale z powodu czynników poza moją kontrolą, mogę nie być w stanie pobrać próbki przez kilka milisekund na raz. Prawdopodobnie bardziej powszechnym przypadkiem jest jednak to, że pobieram próbki nieco wcześniej lub później: zamiast próbkowania w 0, 1 i 2 ms. pobieram próbki w 0, 0,9 i 2,1 ms. przewiduję, że niezależnie od opóźnień, moja częstotliwość próbkowania będzie znacznie, znacznie powyżej limitu Nyquista, a więc nie muszę się martwić aliasingiem.

Myślę, że mogę sobie z tym poradzić w bardziej lub mniej rozsądny sposób odpowiednio zmieniając Alfę, w oparciu o czas od ostatniej próbki.

Częścią mojego rozumowania, że to zadziała, jest to, że EMA "interpoluje liniowo"między poprzednim punktem danych a bieżącym. Jeżeli rozważymy obliczenie EMA poniższej listy próbek w odstępach t: [0,1,2,3,4]. Powinniśmy uzyskać ten sam wynik, jeśli użyjemy interwału 2T, gdzie wejścia stają się [0,2,4], prawda? Jeśli EMA zakładała, że w2 wartość wynosiła 2 od t0, byłoby to takie samo jak obliczanie przedziału t na [0,2,2,4,4], czego nie robi. Czy to w ogóle ma sens?

Czy ktoś może mi powiedzieć jak odpowiednio urozmaicić Alfę? "Proszę pokazać swoje prace."Czyli Pokaż mi matematykę, która dowodzi, że twoja metoda naprawdę działa dobrze.

Author: Curt J. Sampson, 2009-06-21

8 answers

Ta odpowiedź oparta jest na moim dobrym zrozumieniu filtrów dolnoprzepustowych ("wykładnicza średnia krocząca" to tak naprawdę tylko jednobiegunowy filtr dolnoprzepustowy), ale moje mgliste zrozumienie tego, czego szukasz. Myślę, że to jest to, co chcesz:

Po pierwsze, możesz nieco uprościć równanie (wygląda bardziej skomplikowanie, ale jest łatwiejsze w kodzie). Użyję "Y" dla wyjścia i " X " dla wejścia (zamiast S dla wyjścia i Y dla wejścia, jak to zrobiłeś).

Y n = aX + (1-α) Y n-1 → Y n = Y n-1 + α (X - Yn-1)

Które kody do:

 Y += alpha * (X-Y);

Po Drugie, wartość α jest "równa" 1-e - Δt / τ gdzie Δt jest czasem między próbkami, a τ jest stałą czasową filtra dolnoprzepustowego. Mówię "równe" w cudzysłowach, ponieważ działa to dobrze, gdy Δt / τ jest małe w porównaniu do 1, A α = 1-E - Δt/τ ≈ Δt / τ. (Ale nie za mały: napotkasz problemy z kwantyzacją i jeśli nie uciekniesz się do egzotycznych technik, możesz zwykle potrzebne jest dodatkowe N bitów rozdzielczości w zmiennej stanu S, gdzie n = - log2(α). ) Dla większych wartości Δt / τ efekt filtrowania zaczyna znikać, aż dojdziesz do punktu, w którym α jest blisko 1 i w zasadzie po prostu przypisujesz wejście do wyjścia.

Powinno to działać poprawnie z zmiennymi wartościami Δt (zmienność Δt nie jest bardzo ważna, o ile alpha jest mała, w przeciwnym razie napotkasz dość dziwne problemy z Nyquistem / aliasingiem / itp.), oraz jeśli pracujesz nad procesorem, w którym mnożenie jest tańsze niż dzielenie, lub zagadnienia o stałych punktach są ważne, Oblicz wstępnie ω = 1 / τ i rozważ próbę przybliżenia wzoru dla α.

Jeśli naprawdę chcesz wiedzieć, jak wyprowadzić wzór

Α = 1-e - Δt / τ

Następnie rozważmy jego źródło równania różniczkowego:

Y + τ dY / dt = X

Która, gdy X jest funkcją jednostkową, ma rozwiązanie Y = 1-e - t / τ . Dla małych wartości Δt, pochodna może być przybliżona przez ΔY / Δt, dając

Y + τ ΔY / Δt = X

ΔY / Δt = (X-Y) / τ

ΔY = (X-Y) (Δt / τ) = α (X-Y)

I "ekstrapolacja" α = 1-E - Δt / τ pochodzi z próby dopasowania zachowania do przypadku funkcji kroku jednostkowego.

 43
Author: Jason S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 23:42:58

Zobacz tutaj: http://www.eckner.com/research.html

Spójrz na drugi link: ""algorytmy dla nierównomiernie rozłożonych szeregów czasowych: średnie kroczące i inne operatory kroczące"

Dokument opisuje dokładnie algorytmy programowania, których potrzebujesz, myślę.

 6
Author: Bent Tranberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 08:22:33

To nie jest kompletna odpowiedź, ale może być początkiem jednej. To tak daleko, jak mam z tym w godzinę lub Tak gry; zamieszczam to jako przykład tego, czego szukam, a może inspiracji dla innych pracujących nad problemem.

Zaczynam od S0, która jest średnią wynikającą z poprzedniej średniej S-1 i próbka Y0 taken at t0. (t1 - t0) czy mój przedział próby i α jest ustawiony na to, co jest odpowiednie dla ten przedział próby i okres, w którym chcę uśrednić.

Rozważałem, co się stanie, jeśli przegapię próbkę w t1 a zamiast tego trzeba zrobić z próbki Y2 taken at t2? Cóż, możemy zacząć od rozszerzenia równania, aby zobaczyć, co by się stało, gdybyśmy mieli Y1:

  • S2 = aY2 + (1-α) S1, Gdzie S1 = aY1 + (1-α) s0

Podstawianie:

  • S2 = aY2 + (1-α) (aY1 + (1-α) S0)
  • S2 = aY2 + (1-α) aY1 + (1-α) (1-α) s0
  • S2 = aY2 + (1-α) aY1 + (1-α)2S 0

Zauważam, że seria wydaje się rozciągać w nieskończoność w ten sposób, ponieważ możemy zastąpić S n po prawej stronie czas nieokreślony:

  • S2 = aY2 + (1-α) aY1 + (1-α)2(aY0 + (1-α) S-1)
  • S2 = aY2 + (1-α) aY1 + (1-α)2aY0 + (1-α)3S-1
  • itd.

Ok, więc to nie jest naprawdę wielomian (głuptasie), ale jeśli pomnożymy początkowy termin przez jeden, wtedy widzimy wzór:

  • S2 = (1-α)0aY2 + (1-α)aY1 + (1-α)2aY0 + (1-α)3S-1

Hm: to szereg wykładniczy. Quelle niespodzianka! wyobraź sobie, że wychodzi z równania wykładniczej średniej ruchomej!

Tak czy inaczej, mam to x0 + x1 + x2 + x3 + ... coś się dzieje i na pewno czuję zapach e lub naturalnego logarytmu, ale nie pamiętam, dokąd zmierzałem, zanim pobiegłem nie ma czasu.

 2
Author: Curt J. Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 14:38:28

Każda odpowiedź na to pytanie, lub każdy dowód poprawności takiej odpowiedzi, w dużej mierze zależy od danych, które mierzysz.

Jeśli próbki zostały pobrane w t0=0ms, t1=0.9 ms i t2=2.1 ms, ale twój wybór α opiera się na przedziałach 1-ms, a zatem chcesz lokalnie SKORYGOWANEJ αN , dowód poprawności wyboru oznaczałby znajomość wartości próbki przy t=1ms i t=2ms .

Prowadzi to do pytania: Czy można interpolować swoje dane są rozsądne, aby mieć rozsądne domysły co mogło być pomiędzy wartościami? Czy można w ogóle interpolować samą średnią?

Jeśli żadna z tych wartości nie jest możliwa, to z tego, co widzę, logicznym wyborem pomiędzy wartością Y (t) jest ostatnio obliczona średnia, tj. Y(T) ≈ Sn gdzie n jest maxmial takie, że tN

Ten wybór ma prostą konsekwencję: Zostaw α w spokoju, bez względu na różnicę czasu.

If, on the other ręcznie, możliwe jest interpolowanie wartości, to da ci uśrednione próbki o stałych interwałach. Wreszcie, jeśli w ogóle możliwe jest interpolowanie samej średniej, to pytanie byłoby bez znaczenia.

 1
Author: balpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 15:08:33

Używając nieco innej α, która jest równa (1-α Tej z pytania ), podstawowa formuła dodająca nową wartość Y do istniejącej średniej S0 wygląda tak:

S (Y, S0) =

(1-α) Y + aS0 =

Y - aY + aS0 =

Y + α (S0-Y)

Jeśli teraz dodamy długość przedziału czasowego t i zakładamy, że tylko α zależy od tego t, to wzór wygląda następująco to:

S (Y, t, S0) = Y + α t (S0-Y)

Teraz Załóżmy, że t = t1 + t2. Jeżeli średnią tworzy się przez dodanie dwóch wartości Y dla przedziałów czasowych t1 i t2, otrzymana średnia wygląda tak:

S (Y, t2, S (Y, t1,S0)) =

Y + αt2(S (Y, t1,S0) - Y) =

Y + αt2((Y + α t1(S0-Y)) - Y) =

Y + αt2α t1(S0-Y)

Jeśli średnia ta powinna być taka sama, jak gdyby cały przedział t został dodany jednocześnie, wynika z tego, że α t = α t1α t2. Definicja α spełniająca ten wymóg brzmi:

Α x: = A x (dla pewnej stałej A)

Ponieważ:

Α t = A t = A t1 + t2 = A t1 A t2 = α t1α t2

Daje to następującą funkcję uśredniania:

S (Y, t, S0) = Y + a t (S0-Y)

Tak naprawdę nie testowałem tego, ale jeśli założenia, które zrobiłem pasują do twojego scenariusza, wygląda to jak funkcja uśredniania, która może obsłużyć różnice w odstępach próbkowania dość dobrze.

 1
Author: sth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 22:08:12

Załóżmy, że chcemy stworzyć wykładniczą średnią rozkładu na funkcji ciągłej. Jednak nie mamy wszystkich wartości tej funkcji, tylko kilka próbek. Ten wzór uczyniłby średnią ważoną próbek, które mamy z wagami, które mają w średniej ciągłej.

Mnożnikn = AlfaCzasn - Czasn-1

Sumn = Valn + Suma n-1*mnożnikn

Countn = 1 + Countn-1 * mnożnikn

Avgn = suman / Count n

 1
Author: yairchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 13:07:32

Zostawiłbym samą wartość alpha i uzupełnił brakujące dane.

Ponieważ nie wiesz, co się dzieje w czasie, gdy nie możesz próbkować, możesz wypełnić te próbki z 0s lub utrzymać poprzednią wartość stabilną i użyć tych wartości dla EMA. Albo interpolacja wsteczna gdy już masz nową próbkę, wypełnij brakujące wartości i Przelicz EMA.

Próbuję się dowiedzieć, że masz wejście x[n], które ma dziury. Nie ma sposobu, aby obejść fakt, że brak danych. Można więc użyć wstrzymania rzędu zerowego lub ustawić go na zero, lub pewnego rodzaju interpolacji między x[n] A x[n+M], Gdzie M jest liczbą brakujących próbek i N początkiem szczeliny. Możliwe nawet użycie wartości przed n.

 0
Author: freespace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-21 13:35:06

Jest to podobne do otwartego problemu na mojej liście todo. Mam jeden schemat wypracowany w pewnym stopniu, ale nie mam jeszcze pracy matematycznej, aby poprzeć tę sugestię.

Update & summary: chciałbym utrzymać współczynnik wygładzania (Alfa) niezależnie od współczynnika kompensacji (który nazywam tutaj beta). Doskonała odpowiedź Jasona już przyjęta tutaj działa świetnie dla mnie.

Pierwszy krok.

  • Jeśli można również zmierzyć czas od ostatniego pobrania próbki (w zaokrągleniu wielokrotności Twojego stałego czasu próbkowania - więc 7,8 ms od ostatniej próbki będzie 8 jednostek), które mogą być wykorzystane do zastosowania wygładzania wiele razy. Zastosuj w tym przypadku wzór 8 razy. Skutecznie zrobiłeś wygładzanie stronnicze bardziej w kierunku bieżącej wartości.

Drugi krok.

  • aby uzyskać lepsze wygładzanie, musimy dostosować Alfa podczas stosowania formuły 8 razy w poprzednim przypadku.

Jakie będzie to przybliżenie wygładzania proszę pani?

  • ominęło już 7 próbek w powyższym przykładzie
  • zostało to przybliżone w kroku 1 z spłaszczonym ponownym zastosowaniem bieżącej wartości dodatkowe 7 razy
  • jeśli zdefiniujemy współczynnik aproksymacji beta , który zostanie zastosowany wraz z alpha (jako alfa*beta zamiast tylko Alfa), Zakładamy, że 7 pominiętych próbek zmieniało się płynnie między poprzednimi i bieżącymi wartościami próbki.
 0
Author: nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 07:22:09