Thursday 21 December 2017

Algorytm rekurencyjno ruchomy średni


Chcę wdrożyć iteracyjny algorytm, który oblicza średnią ważoną. Specyficzne prawo wagi nie ma znaczenia, ale powinno być bliskie 1 dla najnowszych wartości i blisko 0 do najstarszych. Algorytm powinien być iteracyjny. tzn. nie powinno pamiętać wszystkich poprzednich wartości. Powinien wiedzieć tylko jedną najnowszą wartość i wszelkie agregujące informacje o przeszłości, podobnie jak poprzednie wartości średniej, sumy, liczby itp. Na przykład następujący algorytm może być: Daje wykładniczą masę malejącą, która może być nie dobra. Czy można mieć stopniowo malejącą wagę czy coś? Wymogi dotyczące ważenia prawa są następujące: 1) Waga maleje w przeszłości 2) Mam średni czas lub charakterystyczny czas, dzięki czemu starsze wartości starsze są znacznie mniejsze niż nowsze 3) I powinienem być w stanie ustawić ten czas potrzebuję następujących rzeczy. Załóżmy, że vi są wartościami, gdzie v1 jest pierwszym. Załóżmy, że wi to ciężary. Ale w0 jest ostatnim. Po pierwszej wartości przyszła mi pierwsza średnia Po drugiej wartości v2, powinienem mieć średnią Z następnej wartości powinienem mieć Uwaga, że ​​profil ciężaru idzie ze mną, a ja idę wzdłuż kolejności wartości. To znaczy. każda wartość nie ma własnego ciężaru przez cały czas. Moim celem jest zmniejszenie masy ciała podczas przechodzenia do przeszłości. GT Ale moim zadaniem jest ponowne obliczanie średniej wartości za każdym razem, kiedy pojawia się nowa wartość przy ponownym ważeniu starych wartości. OP Twoje zadanie jest prawie niemożliwe, nawet przy wyjątkowo prostych planach ważenia. Oczekujesz, z pamięcią O (1), podaj średnie ze zmienionym schematem ważenia. Na przykład, w miarę przekazywania nowych wartości, dla niektórych prawie arbitralnie zmieniających się odważników. Jest to niemożliwe z powodu wstrzykiwania. Po scaleniu tych numerów razem tracisz ogromną ilość informacji. Na przykład, nawet jeśli masz wektor wagi. nie można odzyskać oryginalnego wektora wartości lub odwrotnie. Są tylko dwa przypadki, w których można się z tym zgubić: Wagi stałe takie jak 2,2,2. 2: jest to odpowiednik algorytmu uśredniania on-line, którego nie chcesz, ponieważ stare wartości nie są ponownie ważone. Względne odważniki poprzednich odpowiedzi nie zmieniają się. Na przykład można było wykonać wadze 8,4,2,1. i dodaj nowy element o arbitralnej wadze. 1. ale musisz zwiększyć wszystkie poprzednie przez ten sam współczynnik mnożny, jak 16,8,4,21. Dlatego na każdym kroku dodaje się nowy arbitralny ciężar i nowy, arbitralny przeskalowywanie przeszłości, więc masz 2 stopnie swobody (tylko 1, jeśli musisz utrzymać normę w punkcie produktu). Wektory waga, które otrzymasz, wyglądałyby następująco: Tak więc dowolny schemat ważenia możesz wyglądać tak, jak będzie to działać (chyba że musisz zachować coś znormalizowanego przez sumę ciężarów, w takim przypadku należy podzielić nową średnią według nowego sumę, którą można obliczyć, zachowując tylko pamięć O (1). Powtórz mnożenie poprzedniej średniej przez nowe s (które domyślnie rozprowadza się na produktach typu dot-product na wagach) i zastosuj nową wersję wnewValue. Odpowiedziałem, że chcesz, aby wagi sumowały się do 1. Tak długo, jak możesz wygenerować względną wagę bez zmiany w przyszłości, możesz zakończyć się rozwiązaniem, które naśladuje to zachowanie. Oznacza to, że zdefiniowano wagi jako sekwencję i zdefiniowano wejście jako sekwencję. Rozważmy formę: suma (s0i0 s1i1 s2i2. Snin) suma (s0 s1 s2. Sn). Warto zauważyć, że jest to trywialne obliczenie tego przyrostu za pomocą kilku liczników agregacji: Oczywiście, calculWeightFromCounter () w tym przypadku nie powinno generować wagi, które sumują się do jednego - trik polega na tym, że przeciętnie dzieląc przez sumę ciężarów tak że w końcu wagi praktycznie wydają się sumować do jednego. Prawdziwą sztuczką jest to, jak to robisz (). Możesz po prostu zwrócić licznik, na przykład, jednak pamiętaj, że ostatni ważony numer nie byłby blisko sumy liczników koniecznie, więc nie możesz skończyć z dokładnych właściwości chcesz. (Trudno powiedzieć, ponieważ, jak wspomniano wcześniej, pozostawiłeś dość otwarty problem.) Odpowiedział 28 marca o godzinie 21:45. Problem polega na tym, że wagi zmieniają się z każdą nową wartością. W Twoim przypadku nie są. ndash Suzan Cioc 29 marca w godz. 14:43 Rzeczywiste odważniki zmieniają się z każdą nową wartością - liczba cudzysłowów podzielona jest kolejno większa liczba, co powoduje, że faktyczne obciążniki zawsze sumują się do 1. ndash Kaganar 29 marca o 14:45 To jest zbyt długie, aby opublikować komentarz, ale warto wiedzieć. Załóżmy, że masz: w0vn. wnv0 (dobrze nazywaj to w0..nvn..0 na krótko) Następnie następnym krokiem jest: w0vn1. wn1v0 (i to w0..n1vn1..0 na krótkie) Oznacza to, że potrzebujemy sposobu na obliczanie w1..n1vn..0 z w0..nvn..0. Z pewnością możliwe, że vn..0 wynosi 0. 0, z, 0. 0 gdzie z jest w pewnym miejscu x. Jeśli nie mamy dodatkowego składowania, to f (zw (x)) zw (x 1) gdzie w (x) jest wagą dla miejsca x. Ponowne sformatowanie równania, w (x 1) f (zw (x)) z. Cóż, w (x 1) lepiej być stałe dla stałej x, więc f (zw (x)) z lepiej być stałą. W związku z tym f musi pozwolić z propagacji, czyli f (zw (x)) zf (w (x)). Ale tu znów mamy problem. Zauważ, że jeśli z (co może być dowolną liczbą) może się rozprzestrzeniać przez f. wtedy w (x) z pewnością może. Więc f (zw (x)) w (x) f (z). Zatem f (w (x)) w (x) f (z). Ale za stałą x. w (x) jest stała, a więc f (w (x)) również być stała. w (x) jest stała, więc f (z) lepiej być stała tak, że w (x) f (z) jest stała. Zatem f (w (x)) w (x) c gdzie c jest stałą. Więc f (x) cx gdzie c jest stałą, gdy x jest wartością ciężaru. Oznacza to, że każda masa jest wielokrotnością poprzedniej. W ten sposób ciężary przyjmują postać w (x) mbx. Zauważ, że zakłada się, że jedyną informacją f jest ostatnia zagregowana wartość. Zauważ, że w pewnym momencie zostanie zredukowany do tej sytuacji, chyba że jesteś skłonny zapamiętać niezmienną ilość danych reprezentujących dane. Nie możesz reprezentować nieskończonej długości wektora liczb rzeczywistych z liczbą rzeczywistą, ale można je przybliżać w jakikolwiek sposób w stałej, skończonej ilości miejsca. Byłoby to jedynie przybliżeniem. Chociaż nie sprawdziłem tego dokładnie, to jest mój wniosek, że to, czego chcesz, jest niemożliwe z dużą precyzją, ale może być możliwe użycie przestrzeni log (n) (co może być równe O (1) dla wielu praktyczne zastosowania) w celu uzyskania zbliżenia do jakości. Możesz być nawet w mniejszym stopniu wykorzystany. odpowiedziało 29 marca o godzinie 23:01 Próbowałem praktycznie coś kodować (w Javie). Jak już powiedziano, twój cel nie jest osiągalny. Możesz liczyć tylko średnią z pewnej liczby ostatnio zapamiętanych wartości. Jeśli nie musisz być dokładnym, możesz przybliżać starsze wartości. Próbowałem to zrobić, zapamiętywając ostatnie 5 wartości dokładnie i starszych wartości tylko podsumowano przez 5 wartości, pamiętając ostatnie 5 SUM. Z kolei złożonością jest O (2n) dla zapamiętania ostatnich wartości nnn. Jest to bardzo przybliżone przybliżenie. Można zmodyfikować rozmiary tablicy LastValues ​​i lasAggregatedSums w dowolny sposób. Zobacz to zdjęcie, które próbuje wyświetlić wykres ostatnich wartości, pokazując, że pierwsze kolumny (starsze dane) są zapamiętane jako suma zagregowana (nie indywidualnie), a tylko najwcześniejsze 5 wartości są zapamiętywane indywidualnie. Wyzwanie 1. Mój przykład doesnt liczyć wagi, ale myślę, że nie powinno być problemem, aby odpowiednio dodać wagi dla lastAggregatedSums odpowiednio - jedynym problemem jest to, że jeśli chcesz mieć niższe ciężary starszych wartości, byłoby trudniejsze, ponieważ tablica obraca się, więc to nie jest jasne, jaki ciężar, dla którego element tablicy. Być może można zmodyfikować algorytm, aby zawsze zmieniać wartości w tablicy zamiast obracać. Następnie dodanie odważników nie powinno być problemem. Wyzwanie 2. Tablice są inicjowane z 0 wartościami, a te wartości liczą się średnio od początku, nawet jeśli nie otrzymujemy wystarczających wartości. Jeśli używasz algorytmu przez długi czas, prawdopodobnie nie przejmuj się, że się uczy od jakiegoś czasu na początku. Jeśli tak, możesz zamieścić modyfikację - odpowiedział Jan 21 14 w 15:59 Odpowiedź 2017 Stack Exchange, Inc Główną wadą programu jest to, że obliczenia rekursywne są nieprawidłowe. Aby obliczyć średnią, musisz podać sumę bieżącej wartości i pozostałych wartości. a następnie podzielić tę liczbę przez liczbę wartości. Liczba wartości wynosi num. Bieżąca wartość to niezależnie od kalkulatora (). Suma pozostałych wartości jest num-1 pomnożona przez średnią pozostałych wartości. Średnia pozostałych wartości jest obliczana przez wywołanie rekurencyjnego połączenia (). W ten sposób piszemy: Kompletny program używający tej funkcji może wyglądać tak: Uwaga: to nie jest bardzo dobrym sposobem na obliczanie średniej, ponieważ tracisz precyzję za każdym razem, gdy dzielisz bieżącą kwotę num. Gdy ta średnia zostanie zwielokrotniona ponownie podczas powrotu rekurencyjnego, znaczące cyfry, które straciłeś w podziale, nie zostaną przywrócone. Niszczysz informacje dzieląc, a następnie mnożąc sumę. Dla większej precyzji, chciałbyś śledzić sumę w miarę przechodzenia przez elementy, a następnie podzielić na końcu. Kolejnym punktem do rozważenia jest średnia ruchoma. To, co wdrożyliśmy powyżej, nie jest średnią ruchomą, ale jest stałą średnią. Jest to średnia ze stałego okna elementów. Jeśli przesuniesz okno o jedną pozycję, musisz zacząć wszystko od nowa i ponownie obliczyć sumę. Właściwym sposobem implementacji ruchomych okien jest śledzenie wszystkich elementów w oknie. Kiedy przesuniesz okno o jedną pozycję w prawo, usuń najbardziej lewy element z okna i odejmij jej wartość z sumy, a następnie dodaj nowy prawy element do okna i dodaj jego wartość do sumy. To, co czyni go ruchomą sumą. Dzielenie ruchomej sumy liczbą elementów daje średnią ruchomej. Naturalnym sposobem implementowania poruszającego się okna jest kolejka, ponieważ można dodać nowe elementy do głowy i pop stare elementy z ogona. odpowiedział 22 listopada 14 na 17: 44 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 przesuwa się. Wdrażanie 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 notowaniaChasing trendów: rekursywne średnie ruchome reguły handlowe i zasoby internetowe Wai Mun Fong. Lawrence H. M. Departament Finansów i Rachunkowości w Yong, Uniwersytet Narodowy Singapuru, 1 Business Link, Kent Ridge, Singapur 117592, Singapur przyjęty 24 lipca 2003 r. Dostępny online 24 marca 2004 r. Niedawny wzrost i spadek cen akcji w internecie doprowadził do popularnych bańka spekulacyjna w sektorze internetowym. Zbadamy, czy inwestorzy mogliby wykorzystać moment w zasobach internetowych za pomocą reguł handlowych o prostej średniej ruchomej (MA). Symulujemy transakcje techniczne w czasie rzeczywistym, wykorzystując rekursywną strategię handlu stosowaną do ponad 800 średnich ruchomej zasady. Wnioskowanie statystyczne uwzględnia warunkową heteroskompatybilność i współzależności. Nie stwierdzono istotnych zysków handlowych. Większość zasobów internetowych zachowuje się jak przypadkowe spacery, co w połączeniu z wysoką lotnością może być powodem uciążliwego wykonywania średnich ruchomej zasady. Zapasy internetowe Przechowywanie przeciętnych reguł Rekursywna strategia Bootstrap JEL klasyfikacja Tabela 6. Rys. 2. Rys. 3. Rys. 4. Odpowiadający autor. Tel. 65-6874-6693 fax: 65-6779-2083. Copyright 2004 Elsevier B. V. Wszelkie prawa zastrzeżone. Cytowanie artykułów () Rekomendowane artykuły Pokrewne treści książki Copyright 2017 Elsevier B. V. except some content provided by third party. ScienceDirect jest zastrzeżonym znakiem towarowym Elsevier B. V. Cookies są używane przez tę witrynę. Aby zrezygnować lub dowiedzieć się więcej, odwiedź naszą stronę Cookies. Zaloguj się za pośrednictwem swojej instytucji

No comments:

Post a Comment