Przenoszenie średniej rekursywnej implementacji
Naukowiec i inżynier Przewodnik po cyfrowym przetwarzaniu sygnału Autor: Steven W. Smith, Ph. D. Ogromną zaletą filtra średniej ruchomej jest to, że można go zaimplementować za pomocą bardzo szybkiego algorytmu. Aby zrozumieć ten algorytm, wyobraź sobie przekazanie sygnału wejściowego, x, przez siedmio punktowy filtr średniej ruchomej, aby utworzyć sygnał wyjściowy, y. Teraz spójrz na to, jak obliczane są dwa sąsiednie punkty wyjścia, y 50 i y 51: Są to prawie te same punkty obliczeniowe, od x 48 do x 53 muszą być dodane dla y 50, i ponownie dla y 51. Jeśli y 50 zostało już obliczone , najskuteczniejszym sposobem obliczenia y 51 jest: Po znalezieniu y 51 za pomocą y 50, wtedy y 52 można obliczyć z próbki y 51 i tak dalej. Po obliczeniu pierwszego punktu y, wszystkie pozostałe punkty można znaleźć tylko z jednym dodaniem i odejmowaniem na punkt. Można to wyrazić w równaniu: Zauważ, że to równanie wykorzystuje dwa źródła danych do obliczenia każdego punktu na wyjściu: punkty z wejścia i wcześniej obliczone punkty z wyjścia. Nazywa się to równaniem rekursywnym, co oznacza, że wynik jednego obliczenia jest wykorzystywany w przyszłych obliczeniach. (Termin recursive ma również inne znaczenie, zwłaszcza w informatyce). Rozdział 19 omawia bardziej szczegółowo różne filtry rekursywne. Należy pamiętać, że średni ruchomy filtr rekursywny bardzo różni się od typowych filtrów rekursywnych. W szczególności, większość filtrów rekurencyjnych ma nieskończenie długą odpowiedź impulsową (IIR), złożoną z sinusoid i wykładników. Odpowiedź impulsowa średniej ruchomej jest impulsem prostokątnym (skończona odpowiedź impulsowa lub FIR). Ten algorytm jest szybszy niż inne filtry cyfrowe z kilku powodów. Po pierwsze, istnieją tylko dwa obliczenia na punkt, niezależnie od długości jądra filtra. Po drugie, dodawanie i odejmowanie są jedynymi potrzebnymi operacjami matematycznymi, podczas gdy większość cyfrowych filtrów wymaga czasochłonnego mnożenia. Po trzecie, schemat indeksowania jest bardzo prosty. Każdy indeks w równaniu. 15-3 znajduje się przez dodanie lub odjęcie stałych całkowitych, które można obliczyć przed rozpoczęciem filtrowania (tj. P i q). Dalej, cały algorytm można przeprowadzić z reprezentacją całkowitą. W zależności od użytego sprzętu, liczby całkowite mogą być o ponad rząd wielkości szybsze niż zmiennoprzecinkowe. Zaskakująco, liczba całkowita reprezentuje lepiej niż zmiennoprzecinkowy z tym algorytmem, a ponadto jest szybsza. Błąd zaokrąglania z arytmetyki zmiennoprzecinkowej może spowodować nieoczekiwane rezultaty, jeśli nie będziesz ostrożny. Na przykład wyobraź sobie, że 10 000 próbek sygnału jest filtrowanych za pomocą tej metody. Ostatnia próbka w przefiltrowanym sygnale zawiera skumulowany błąd 10 000 dodatków i 10 000 odejmowań. Pojawia się w sygnale wyjściowym jako przesunięcie dryfujące. Liczby całkowite nie mają tego problemu, ponieważ nie ma błędu zaokrąglania w arytmetyce. Jeśli musisz używać zmiennoprzecinkowego z tym algorytmem, program w Tabeli 15-2 pokazuje, jak użyć akumulatora podwójnej precyzji, aby wyeliminować ten dryf. Zasadniczo mam tablicę wartości takich jak ta: Powyższa tablica jest uproszczona, zbieram 1 wartość na milisekundę w moim prawdziwym kodzie i muszę przetworzyć dane wyjściowe na algorytmie, który napisałem, aby znaleźć najbliższy szczyt przed punktem w czasie. Moja logika kończy się niepowodzeniem, ponieważ w moim przykładzie powyżej 0.36 jest prawdziwym szczytem, ale mój algorytm będzie wyglądał wstecz i zobaczy ostatnią liczbę 0.25 jako szczyt, ponieważ przed nią jest spadek do 0.24. Celem jest przyjęcie tych wartości i zastosowanie do nich algorytmu, który wygładzi je nieco, tak żebym miał więcej wartości liniowych. (tj: Id jak moje wyniki być kręty, nie jaggedy) Powiedziano mi, aby zastosować wykładniczy filtr średniej ruchomej do moich wartości. Jak mogę to zrobić? Bardzo trudno jest mi czytać równania matematyczne, z kodem radzę sobie znacznie lepiej. Jak przetwarzać wartości w mojej tablicy, stosując wykładnicze obliczenia średniej ruchomej, aby je wyrównać zapytano 8 lutego 12 o 20:27 Obliczanie wykładniczej średniej kroczącej. musisz zachować pewien stan i potrzebujesz parametru strojenia. To wymaga małej klasy (zakładając, że korzystasz z Java 5 lub nowszej wersji): Utwórz instancję z żądanym parametrem zaniku (możesz ustawić strojenie od 0 do 1), a następnie użyj funkcji average () do filtrowania. Czytając stronę o nawrocie matematycznym, wszystko, co naprawdę trzeba wiedzieć, kiedy zamienia się ją w kod, jest takie, że matematycy lubią pisać indeksy w tablicach i sekwencjach z indeksami dolnymi. (Są też inne zapisy, które nie pomagają.) Jednak EMA jest dość prosta, ponieważ wystarczy zapamiętać jedną starą wartość, nie wymagającą skomplikowanych tablic stanów. odpowiedział 08 lutego 12 o 20:42 TKKocheran: Dość dużo. Czy to nie jest miłe, gdy rzeczy mogą być proste (jeśli zaczynasz z nową sekwencją, zdobądź nową średnią). Zauważ, że kilka pierwszych haseł w uśrednionej sekwencji będzie przeskakiwało trochę ze względu na efekty graniczne, ale dostajesz te z innymi ruchomymi średnimi także. Jednak dobrą zaletą jest to, że można zawinąć logikę średniej ruchomej do uśredniającego i eksperymentować, nie zakłócając zbytnio reszty programu. ndash Donal Fellows 09 lutego 12 o 0:06 Mam trudności ze zrozumieniem twoich pytań, ale i tak postaram się odpowiedzieć. 1) Jeśli twój algorytm znalazł 0.25 zamiast 0.36, to jest źle. Jest źle, ponieważ zakłada monotoniczny wzrost lub spadek (który zawsze rośnie lub zawsze spada). O ile nie wytypujesz WSZYSTKICH twoich danych, twoje punkty danych --- podczas ich prezentacji --- są nieliniowe. Jeśli naprawdę chcesz znaleźć maksymalną wartość pomiędzy dwoma punktami w czasie, podziel tablicę od tmin do tmax i znajdź maksimum tego podbarwa. 2) Teraz pojęcie średnich kroczących jest bardzo proste: wyobraź sobie, że mam następującą listę: 1.4, 1.5, 1.4, 1.5, 1.5. Mogę go wygładzić, biorąc średnią z dwóch liczb: 1.45, 1.45, 1.45, 1.5. Zauważ, że pierwsza liczba to średnia z 1,5 i 1,4 (druga i pierwsza liczba), druga (nowa lista) to średnia z 1,4 i 1,5 (trzecia i druga stara lista), a trzecia (nowa lista) to średnio 1,5 i 1,4 (czwarty i trzeci) i tak dalej. Mogłem zrobić okres trzy lub cztery, lub n. Zwróć uwagę, że dane są znacznie płynniejsze. Dobrym sposobem, aby zobaczyć średnie ruchome w pracy, jest przejście do Google Finance, wybór akcji (wypróbuj Tesla Motors pretty volatile (TSLA)) i kliknij technicznych na dole wykresu. Wybierz średnią ruchomą z danym okresem i wykładniczą średnią kroczącą, aby porównać różnice. Wykładnicza średnia krocząca jest tylko kolejnym rozwinięciem tego, ale waży starsze dane mniej niż nowe dane, jest to sposób na odchylenie wygładzania w kierunku tyłu. Proszę przeczytać wpis w Wikipedii. Jest to raczej komentarz niż odpowiedź, ale małe pole komentarza było niewielkie. Powodzenia. Jeśli masz problemy z matematyką, możesz użyć prostej średniej ruchomej zamiast wykładniczej. Wynik wyjściowy będzie więc ostatnim x terminami podzielonymi przez x. Nieprawdziwy kod pseudokodowy: pamiętaj, że będziesz musiał obsługiwać początkowe i końcowe części danych, ponieważ wyraźnie nie możesz uśrednić ostatnich 5 warunków, gdy jesteś na drugim punkcie danych. Ponadto istnieją skuteczniejsze sposoby obliczania tej średniej ruchomej (suma suma - najstarsze najnowsze), ale ma to na celu uzyskanie koncepcji na temat tego, co się dzieje. odpowiedział 8 lutego 12 o 20: 41 Statystyki proste prosta średnia ruchoma to algorytm, który oblicza nieważoną średnią z ostatnich n próbek. Parametr n jest często nazywany rozmiarem okna, ponieważ algorytm może być traktowany jako okno przesuwające się po punktach danych. Dzięki zastosowaniu rekurencyjnego sformułowania algorytmu liczba operacji wymaganych na próbkę zostaje zredukowana do jednego dodania, jednego odejmowania i jednego podziału. Ponieważ formulacja jest niezależna od rozmiaru okna n. złożoność środowiska wykonawczego to O (1). tj. stała. Formuła rekurencyjna nieważonej średniej kroczącej to, gdzie średnia to średnia krocząca, a x oznacza punkt danych. Tak więc za każdym razem, gdy okno przesuwa się w prawo, jeden punkt danych, ogon, opuszcza się, a jeden punkt danych, głowa, wchodzi. Implementacja Implementacja prostej średniej kroczącej musi uwzględniać inicjalizację algorytmu Tak długo jak okno nie jest w pełni wypełnione wartościami, formuła rekursywna kończy się niepowodzeniem. Pamięć masowa Dostęp do elementu ogonowego jest wymagany, co w zależności od implementacji wymaga przechowywania n elementów. Moja implementacja używa przedstawionej formuły, gdy okno jest całkowicie wypełnione wartościami, w przeciwnym razie przełącza się na formułę, która aktualizuje średnią, przeliczając sumę poprzednich elementów. Zauważ, że może to prowadzić do niestabilności numerycznych z powodu arytmetyki zmiennoprzecinkowej. Jeśli chodzi o zużycie pamięci, implementacja wykorzystuje iteratory do śledzenia elementów głowy i ogona. Prowadzi to do implementacji ze stałymi wymaganiami pamięciowymi niezależnie od rozmiaru okna. Oto procedura aktualizacji, która przesuwa okno w prawo. W większości zbiorów unieważnia się ich enumeratory, gdy kolekcja podstawowa jest modyfikowana. Implementacja opiera się jednak na prawidłowych modułach wyliczających. Zwłaszcza w aplikacjach strumieniowych podstawowe potrzeby kolekcji są modyfikowane po pojawieniu się nowego elementu. Jednym ze sposobów radzenia sobie z tym jest utworzenie prostej, okrągłej kolekcji o rozmiarze stałym n1, która nigdy nie unieważnia jej iteratorów i na przemian dodaje element i wywołuje Shift. Chciałbym dowiedzieć się, jak to właściwie zaimplementować, ponieważ funkcja Test jest bardzo myląca dla mnie8230 Czy muszę konwertować dane do Array, a następnie uruchomić SMA SMA nowy SMA (20, tablica) przez 20 okresowy SMA Jak obsługiwać Funkcja shift () Czy konieczne jest implementowanie konstruktorów. (przepraszam za zamieszanie). Nie musisz konwertować danych do tablicy, o ile dane implementują IEnumerable1, a typ wyliczeniowy jest podwójny. Jeśli chodzi o prywatne wiadomości, musisz przekonwertować DataRow na coś, co jest przeliczalne na podwójne wartości. Twoje podejście działa. Shift, przesuwa okno o jedną pozycję w lewo. Dla zbioru danych, powiedzmy 40 wartości i 20-dniowego SMA, masz 21 pozycji, w które okno się mieści (40 8211 20 1). Za każdym razem, gdy wywołujesz Shift (), okno przesuwa się w lewo o jedną pozycję, a Average () zwraca SMA dla aktualnej pozycji okna. Oznacza to nieważoną średnią wszystkich wartości w oknie. Dodatkowo moja implementacja pozwala obliczyć SMA, nawet jeśli okno nie jest w pełni wypełnione na początku. Tak więc w istocie Hope to pomaga. Wszelkie dodatkowe pytania PRAWA AUTORSKIEGO Christoph Heindl i cheind. wordpress, 2009-2017. Nieautoryzowane użycie i kopiowanie tego materiału bez wyraźnej i pisemnej zgody autora i właściciela tego bloga jest surowo zabronione. Można używać fragmentów i linków pod warunkiem, że Christoph Heindl i cheind. wordpress otrzymają pełny i wyraźny kredyt z właściwym i konkretnym wskazaniem oryginalnych treści. Najnowsze posty
Comments
Post a Comment