Sunday 19 November 2017

Ruch średnia algorytm implementacji


Implementacja BFL średniej ruchomej Ta implementacja wcale nie wydaje się optymalna Myślę, że powinien używać standardowego przyrostowego algorytmu, który jest niezależny od wielkości okna. W takim algorytmie należy zachować bieżącą sumę elementów dla rozmiaru okna, a na każdym kroku odjąć najstarszy element i dodać nowy element do sumy. Następnie należy zwrócić wynik podziału według wielkości okna jako średniej. Innym problemem wydaje się być to, że zawsze otrzymuję wynik jako liczba całkowita, nawet jeśli moje liczby są prawdziwe. Czy jest jakiś sposób wokół Tagi: bfl movingaverage afl hana Kedar Swadi 17 września 2017 o 09:10 AM Share amp Follow Musisz śledzić ostatnie 7 dni godziny pracy w płaskiej pętli odczytu plików. Jest używany do pomiaru zmęczenia wykresów pracy. Teraz mam coś, co działa, ale wydaje się dosyć wyraźne i nie wiem, czy jest jakiś wzór bardziej zwięzły. Obecnie mam klasę Java z tablicą statyczną, która ma przechowywać ostatnie dane x dni, a następnie podczas czytania pliku, zgarniam pierwszy element i przenieść pozostałe 6 (przez cały tydzień). Przetwarzanie tej tablicy statycznej odbywa się we własnej metodzie tj. Moje pytanie: czy jest to rozsądne podejście do projektowania, czy jest coś oślepiać oczywistego i prostego w wykonaniu tego zadania? Dzięki chłopaki zapytał 30 sierpnia 11 w 14:33 Podziękowania dla wielu facetów: Dostałem wiadomość: użyj obiektu na wyższym poziomie i wykorzystaj odpowiednich metod lub okrągłego bufora. Wielkie odpowiedzi, wszystkie. Kiedy myślisz o tym, zawsze potrzebujesz dostępu do całej tablicy, aby można było pozbyć się tego pierwszego wpisu - czego nie byłem pewny sam. Z ulgą odczuwałem ulgę, że nie brakowało mi trochę okładki i był w zasadzie na rozsądnym, jeśli nie skutecznym i krótkim utworze To właśnie uwielbiam tę witrynę: wysokiej jakości, trafne odpowiedzi od osób, które znają swoje sht. ndash Pete855217 Aug 30 11 at 15:05 Dlaczego inicjalizujesz runningTotal na null Jaki jest jego typ Gdzie jest zadeklarowane To by dobrze, jeśli umieścisz kilka próbek kodu, które przypominają rzeczywisty kod Javy. Przeprowadzając się, moja krytyka będzie następująca: Twoja funkcja nie robi zbyt wiele. Funkcja lub metoda powinna być spójna. Bardziej właściwie powinni zrobić jedną rzecz i jedną rzecz. Co gorsza, co dzieje się w Twojej pętli, gdy x 5 SkopiujcieTotal6 do uruchomieniaTotal5. ale wtedy masz dwie kopie tej samej wartości w pozycjach 5 i 6. W projekcie twoja funkcja movesshuffles elementów w Twojej tablicy oblicza całkowite odbitki do standardowego błędu zwraca całkowitą Za dużo. Moja pierwsza sugestia nie polega na przenoszeniu rzeczy w tablicy. Zamiast tego zastosuj okrągły bufor i użyj go zamiast tablicy. To uprości Twój projekt. Moja druga sugestia polega na rozbiciu na funkcje, które są spójne: mieć strukturę danych (okrągły bufor), która pozwala na dodanie do niej (i która spada najstarszej pozycji, gdy osiągnie swoją zdolność.) Struktura danych implementuje interator ma funkcję, która oblicza całkowitą liczbę iteratorów (nie obchodzi cię to, czy obliczasz sumę z tablicy, listy lub okrągłego bufera). Nie nazwij tego łącznie. Nazywaj to sumą, czyli tym, czym się zajmujesz. Thats what Id do :) To wspaniałe info luis, pamiętaj jednak, że ta funkcja jest małą częścią funkcjonalności tej klasy, a nadmierny wzrost kodu spowoduje, że będzie idealny. Jesteś technicznie poprawny i rozumiem, że mój kod nie ma 39 aż tyle 39, ale w tym samym czasie czasami lepiej błądzić po stronie mniejszych, jaśniejszych kodów, niż pójść na perfekcję. Biorąc pod uwagę moje umiejętności Java, nawet uczynienie pseudokodów, które opisujesz kompilacji, spowodowałoby, żebym zadał mi ten budżet (), ale dzięki jasnemu opisowi. ndash Pete855217 Aug 31 11 at 2:23 Hmmm, to nie chodzi o perfekcję, ale o ustalone praktyki przemysłowe, które znamy przez ostatnie 3 dekady. Czystym kodem jest zawsze ten, który jest podzielony na partycje. Mamy dziesięciolecia dowodów, które wskazują, że można to osiągnąć w ogólnym przypadku (pod względem efektywności pod względem kosztów, redukcji defektów, zrozumienia itp.). chyba że jest to wyrzucony kod jednorazowego rodzaju rzeczy. Nigdy nie jest to kosztowne, gdy rozpoczyna się analiza problemu w ten sposób. Kodowanie 101, złamanie problemu i kod następuje, ani nadmierny, ani trudny) ndash luis. espinal Aug 31 11 at 15:55 Twoje zadanie jest zbyt proste, a aproach przyjąłeś z pewnością jest dobry do pracy. Jeśli jednak chcesz używać lepszego projektu, musisz pozbyć się całego ruchu liczbowego, który lepiej posłużysz się kolejką FIFO i dobrze użyj metod push i pop w taki sposób, aby kod nie odzwierciedlał żadnego ruchu danych, tylko dwie akcje logiczne nowych danych i usuwać dane starsze niż 7 dni. odpowiedział Aug 30 11 w 14: 49Instruktor i Inżynierowie Przewodnik po przetwarzaniu sygnałów cyfrowych Steven W. Smith, Ph. D. Ogromną zaletą ruchomych filtrów średnich jest możliwość szybkiego wdrożenia algorytmu. Aby zrozumieć ten algorytm, wyobraź sobie, że przechodzisz sygnał wejściowy, x, przez siedem punktowy średniometr ruchomy, aby utworzyć sygnał wyjściowy, y. Spójrzmy teraz, jak obliczane są dwa sąsiednie punkty wyjściowe, y 50 i y 51: są to prawie takie same punkty obliczeniowe od x 48 do x 53 dla y 50 i ponownie dla y 51. Jeśli obliczono y 50 , najbardziej efektywnym sposobem obliczenia y 51 jest: Gdy y 51 stwierdzono przy użyciu y50, to y 52 można wyliczyć z próbki y 51, i tak dalej. Po pierwszym punkcie jest obliczany w y, wszystkie pozostałe punkty można znaleźć tylko z jednym dodatkiem i odejmowaniem na punkt. Można to wyrazić w równaniu: Zauważ, że to równanie wykorzystuje dwa źródła danych do obliczania każdego punktu na wyjściu: punkty z wejściowych i wcześniej wyliczonych punktów z wyjścia. Nazywa się to równaniem rekurencyjnym, co oznacza, że ​​w obliczeniach przyszłych stosuje się jedno obliczenie. (Termin rekurencyjny ma również inne znaczenia, szczególnie w informatyce). Rozdział 19 omawia wiele bardziej szczegółowych filtrów rekurencyjnych. Pamiętaj, że średnia średnica ruchoma rekurencyjnego jest bardzo różna od typowych filtrów rekursywnych. W szczególności większość filtrów rekurencyjnych ma nieskończenie długą odpowiedź impulsową (IIR), składającą się z sinusoid i wykładników. Odpowiedź impulsowa średniej ruchomej jest prostokątnym impulsem (skończona odpowiedź impulsu lub FIR). Ten algorytm jest szybszy niż inne filtry cyfrowe z kilku powodów. Po pierwsze, istnieją dwa obliczenia na punkt, niezależnie od długości jądra filtru. Po drugie, dodawanie i odejmowanie są jedynymi potrzebnymi operacjami matematycznymi, podczas gdy większość filtrów cyfrowych wymaga długotrwałego pomnożenia. Po trzecie, schemat indeksowania jest bardzo prosty. Każdy indeks w równ. 15-3 można znaleźć przez dodanie lub odjęcie stałych całkowitych, które można obliczyć przed rozpoczęciem filtrowania (tzn. P i q). Forth, cały algorytm może być przeprowadzony z reprezentacją liczb całkowitych. W zależności od używanego sprzętu liczba całkowita może być większa niż kolejność wielkości szybciej niż wartość zmiennoprzecinkowa. Co zaskakujące, reprezentacja liczb całkowitych działa lepiej niż zmiennoprzecinkowe z tym algorytmem, a nie szybsza. Błąd okrągły z arytmetyki zmiennoprzecinkowej może powodować nieoczekiwane rezultaty, jeśli nie jesteś ostrożny. Na przykład wyobraź sobie 10 000 sygnałów próbek, które są filtrowane tą metodą. Ostatnia próba w filtrowanym sygnale zawiera skumulowany błąd wynoszący 10 000 dodatków i 10 000 odejmowań. To pojawia się w sygnale wyjściowym jako przesunięcie drift. Liczba całkowita nie ma tego problemu, ponieważ w arytmetyce nie występuje błąd okrągły. Jeśli musisz używać zmiennoprzecinkowych z tym algorytmem, program w Tabeli 15-2 pokazuje jak używać podwójnego akumulatora precyzyjnego, aby wyeliminować ten dryft. W statystykach prosta średnia ruchoma jest algorytmem obliczającym nieważoną średnią z ostatnich n próbek. Parametr n jest nazywany rozmiarem okna, ponieważ algorytm może być traktowany jako okno, które przesuwa się nad punktami danych. Przy użyciu formuły rekurencyjnej algorytmu liczba operacji wymaganych na próbkę jest zmniejszona do jednego dodatku, jednego odejmowania i jednego podziału. Ponieważ formulacja jest niezależna od wielkości okna n. złożoność wykonania jest O (1). tzn. stała. Rekurencyjna formuła nieważonej średniej ruchomej jest, gdzie średnią jest średnią kroczącą, a x reprezentuje punkt danych. Kiedy więc okno przesuwa się w prawo, jeden punkt danych, ogon, zrzuca się i jeden punkt danych, głowa, przenosi się do środka. Wdrożenie Wdrażanie prostej średniej ruchomej musi uwzględniać następujące inicjowanie algorytmów okno nie jest w pełni wypełnione wartościami, formuła rekurencyjna nie powiedzie się. Magazynowanie Wymagany jest dostęp do elementu końcowego, który w zależności od implementacji wymaga przechowywania n elementów. Moja implementacja wykorzystuje prezentowaną formułę, gdy okno jest całkowicie wypełnione wartościami i w inny sposób przechodzi do formuły, która aktualizuje średnią przez ponowne obliczenie sumy poprzednich elementów. Należy zauważyć, że może to prowadzić do niestabilności liczbowych z powodu arytmetyki zmiennoprzecinkowej. Jeśli chodzi o zużycie pamięci, implementacja wykorzystuje iteratory, aby śledzić elementy głowy i ogona. Prowadzi to do wdrożenia ze stałymi wymaganiami pamięci niezależnie od wielkości okna. Oto procedura aktualizacji, która przesuwa okno po prawej stronie. W większości kolekcji unieważnia ich enumeratory, gdy zmodyfikowana jest kolekcja bazowa. Wdrożenie opiera się jednak na właściwych wyliciach. Szczególnie w aplikacjach opartych na transmisjach strumieniowych biblioteka bazowa musi zostać zmodyfikowana, gdy pojawi się nowy element. Jednym ze sposobów radzenia sobie z tym jest utworzenie prostego okrągłego rozmiaru o stałym rozmiarze o rozmiarze n1, który nigdy nie unieważnia iteratorów i na przemian dodaj element i wywołuje Shift. Chciałbym móc dowiedzieć się, w jaki sposób faktycznie to wdrożyć, ponieważ funkcja testu jest bardzo myląca dla me8230 Czy muszę konwertować dane na tablicę, a następnie uruchomić SMA sma nową macierz SMA (20, tablica) na okres 20 SMA Jak sobie radzić Funkcja shift () Czy konieczne jest wdrożenie konstruktorów. (przepraszam za zamieszanie). Nie, don8217t potrzebuje przekonwertować dane na tablicę, dopóki Twoje dane będą implementować IEnumerable1, a typ wymieniony jest podwójny. Jeśli chodzi o prywatne wiadomości, musisz przekonwertować DataRow do czegoś, co jest wartościami podwójnymi. Twoje podejście działa. Przesuń, przesuwa okno o jedną pozycję w lewo. Dla zbioru danych mówiących 40 wartości i 20 okresu SMA masz 21 pozycji, w których mieści się okno (40 8211 20 1). Za każdym razem, gdy zadzwonisz do Shift (), okno zostanie przesunięte w lewo o jedną pozycję, a funkcja Average () zwraca SMA dla bieżącej pozycji okna. Oznacza to nieważoną średnią wszystkich wartości wewnątrz okna. Dodatkowo moja implementacja pozwala obliczyć SMA, nawet jeśli okno nie jest w pełni wypełnione na początku. Więc w istocie nadzieję, że to pomaga. Wszelkie dodatkowe pytania O PRAWO AUTORSKICH Christoph Heindl i cheind. wordpress, 2009-2017. Nieautoryzowane użycie i powielanie tego materiału bez wyraźnej pisemnej zgody autora tego autora i jego właściciela jest surowo zabronione. Mogą być wykorzystane fragmenty i linki, pod warunkiem pełnego i wyraźnego przyznania Christoph Heindl i cheind. wordpress z odpowiednim i konkretnym kierunkiem oryginalnej zawartości. Ostatnie wpisy

No comments:

Post a Comment