Poniższe przykłady powodują średnią ruchome poprzednich wartości WINDOW. Obniżymy pierwsze (WINDOW -1) wartoś ci, ponieważ uda nam się znaleźćś rednio przed nimi. (Domyślnym zachowaniem dla convolution jest założenie, że wartości przed rozpoczęciem naszej sekwencji to 0). (Więcej formalnie tworzymy sekwencję y dla sekwencji x, gdzie yi (xi x (i1) 8230. x (in)) n) Wykorzystuje to funkcję splotów numpy8217s. Jest to ogólna średnia ruchoma operacja. Zmienianie współczynników wagi sprawia, że niektóre ważniejsze wartości wyrównywania pozwalają odpowiednio przeanalizować wartość średnią wokół punktu, a nie wcześniej. Zamiast wycinać wartości, możemy ustalić wartości początkowe, jak pokazano na poniższym przykładzie: naszym pierwszym krokiem jest wykreślenie wykresu przedstawiającego średnie dwie tablice. Let8217 tworzą dwie tablice xi y i spisują je. x będzie od 1 do 10. i y mają te same elementy w kolejności losowej. Pomoże nam to sprawdzić, czy rzeczywiście średnia jest prawidłowa. Let8217s losowo losują kolejność naszych elementów w y i ponownie spisują: odnośnie y let8217s zobaczyć, jak zachowuje się średnia ruchoma: W następnym ćwiczeniu będziemy pisać średnie ruchome. Udostępnij to: W ten sposób: Nawigacja po wpisie Zostaw odpowiedź Anuluj odpowiedź d blogerów tak: Przedstawiliśmy wcześniej, jak utworzyć średnie ruchome za pomocą pythona. Ten samouczek będzie kontynuacją tego tematu. Średnia ruchoma w kontekście statystyk, nazywana również przeciętną waloryzacją, jest rodzajem skończonej odpowiedzi impulsowej. W naszym poprzednim samouczku wymyśliliśmy wartości tablic xi y: wykres x82 x x względem ruchomej średniej y, którą nazwiemy yMA: Po pierwsze, let8217 wyrównują długość obu tablic: i pokazać to w kontekście: wynik Wykres: Aby to zrozumieć, let8217 spisują dwa różne relacje: x vs y i x vs MAy: średnia ruchoma jest zielona fabuła, która zaczyna się od 3: Podziel się tym: W ten sposób: Nawigacja po wpisaniu Pozostaw odpowiedź Anuluj odpowiedź Bardzo przydatne chciałbym przeczytać ostatnią część na dużych zbiorach danych Mam nadzieję, że wkrótce wkrótce powstanie blogerów takich jak: Wiem, że to jest stare pytanie, ale jest to rozwiązanie, które nie używa żadnych dodatkowych struktur danych ani bibliotek. Jest liniowa w liczbie elementów listy wejściowej i nie mogę myśleć o innym sposobie, aby uczynić ją bardziej wydajną (w rzeczywistości, jeśli ktoś wie o lepszym sposobie rozdzielania wyniku, proszę dać mi znać). UWAGA: byłoby to znacznie szybsze przy użyciu tablicy numpy zamiast listy, ale chciałem wyeliminować wszystkie zależności. Byłoby to również możliwe do poprawy wydajności poprzez wielowątkowe wykonanie Funkcja zakłada, że lista wejściowa jest w jednym wymiarze, więc bądź ostrożny. UPD: Alleo i jasaarim zaproponowali bardziej wydajne rozwiązania. Możesz użyć np. convolve dla tego: Argument trybu określa sposób obsługi krawędzi. Wybrałem tutaj prawidłowy tryb, ponieważ myślę, że to oznacza, że większość ludzi spodziewa się, że działa, ale mogą mieć inne priorytety. Oto spisek, który ilustruje różnicę między trybami: odpowiedział 24 marca o godzinie 22:01 lubię to rozwiązanie, ponieważ jest czyste (jedna linia) i stosunkowo wydajne (praca wykonywana wewnątrz numpy). Ale Alemo39s quotEfficient solutionquot używa numpy. cumsum ma lepszą złożoność. ndash Ulrich Stern Sep 25 15 at 0:31 Możesz obliczyć średnią biegu z: Na szczęście numpy zawiera funkcję convolve, którą możemy użyć do przyspieszenia. Średnia bieżąca jest równowaŜna x x z wektorem, który jest długością N, ze wszystkimi członami równymi 1N. Numperyczna implementacja convolve obejmuje początek przejściowy, więc musisz usunąć pierwsze punkty N-1: Na mojej maszynie szybka wersja jest 20-30 razy szybsza, w zależności od długości wektora wejściowego i wielkości okna uśredniania . Należy zauważyć, że convolve zawiera ten sam tryb, który wydaje się, że powinien on rozwiązać problem przejściowy, ale dzieli go pomiędzy początek i koniec. Usuwa przejście od końca, a na początku nie ma. Cóż, myślę, że to kwestia priorytetów, nie potrzebuję tej samej liczby wyników na koszt uzyskania stoku w kierunku zero, który nie ma w danych. BTW, tutaj jest polecenie pokazujące różnicę między trybach: tryby (39full39, 39same39, 39valid39) plot (convolve (te ((200,)), te ((50,)) 4750, modem)) dla mw trybach legenda osi (-10, 251, -1, 1.1) (tryby, loc39lower center39) (importowany z Pyplot i numpy). ndash lapis Mar 24 14 at 13:56 Pandas jest bardziej odpowiedni dla tego niż NumPy lub SciPy. Jego funkcja toczy się dobrze. Zwraca również tablicę NumPy, gdy wejście jest tablicą. Trudno pokonać walcowanie w dowolnej implementacji Pythona. Oto przykładowa skuteczność w stosunku do dwóch proponowanych rozwiązań: istnieją również ładne opcje, jak radzić sobie z wartościami krawędzi. Jestem zawsze zirytowany przez funkcję przetwarzania sygnału, która zwraca sygnały wyjściowe o różnym kształcie niż sygnały wejściowe, gdy oba wejścia i wyjścia mają taki sam charakter (na przykład oba sygnały czasowe). Łamie korespondencję z powiązaną zmienną niezależną (np. Czasową, częstotliwościową), co sprawia, że spisywanie lub porównywanie nie jest kwestią bezpośrednią. Jeśli chcesz podzielić się wrażeniami, możesz zmienić ostatnie wiersze proponowanej funkcji jako ynp. convolve (ww. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 at 19:56 Trochę późno na przyjęcie, ale ja zrobiłem własną własną funkcję, która NIE owija się wokół końców lub wkładek z zera, które są następnie wykorzystywane do znalezienia średniej, jak również. Kolejnym przykładem jest to, że ponownie pobiera sygnał w punktach rozmieszczonych liniowo. Dostosuj kod w dowolnym momencie, aby uzyskać inne funkcje. Metoda jest prostym mnożeniem macierzy z znormalizowanym jądrem Gaussa. Proste użycie sygnału sinusoidalnego z dodatkiem normalnego rozproszonego szumu: To pytanie jest teraz nawet starsze niż kiedy NeXuS napisał o tym w zeszłym miesiącu, ALE podoba mi się, jak jego kod dotyczy przypadków krawędzi. Jednakże, ponieważ jest to prosta średnia ruchoma, jej wyniki pozostają w tyle za danymi, które dotyczą. Myślałem, że zajmowanie się sprawami krawędzi w bardziej satysfakcjonujący sposób niż tryby NumPys są ważne. podobnie. i pełna może być osiągnięta przez zastosowanie podobnego podejścia do metody opartej na splocie (). Mój wkład wykorzystuje centralną średnią z przebiegu, aby dostosować wyniki do swoich danych. Kiedy dostępne są dwa punkty dla pełnowymiarowego okna, średnie są obliczane z kolejnych mniejszych okien na krawędziach tablicy. W rzeczywistości z kolejno większych okien, ale to szczegóły implementacji. Jest to stosunkowo wolne, ponieważ używa convolve (). i prawdopodobnie mogłaby być sprobana dość dużo przez prawdziwą Pythonistę, jednak wierzę, że idea stoi. odpowiedział 2 stycznia na 0:28 np. convolve jest ładne, ale powolne, gdy szerokość okna rośnie duży. Niektóre odpowiedzi zapewniają bardziej efektywne algorytmy z np. cumsum, ale wydają się niezdolne do obsługi wartości krawędzi. Sam zaimplementowałem algorytm, który może dobrze poradzić sobie z tym problemem, jeśli ten problem jest zadeklarowany jako: parametr wejściowy mergenum może być uważany za 2 szerokość okna 1. Wiem, że ten kod jest trochę nieczytelny, jeśli uważasz, że jest on przydatny i chcesz trochę rozszerzeń, proszę daj mi znać i zaktualizuję tę odpowiedź. (Ponieważ pisanie wyjaśnienia może kosztować mn dużo czasu, mam nadzieję, że to zrobię tylko wtedy, gdy ktoś tego potrzebuje. Proszę wybaczyć mi za moje lenistwo :)) Jeśli tylko u interesuje się jego pierwotną wersją: jej jeszcze bardziej nieczytelny: pierwsze rozwiązanie pozbywa się problemu krawędzi przez zerowanie obwiedni wokół tablicy, ale drugie rozwiązanie rozwiązane tutaj poradzi sobie to w sposób twardy i bezpośredni :) lapis tak, ale powiedzmy, że używasz metody cumsum na pierwszym zaznaczyć i zapisać swoją średnią przeciętną tablicę dla następny zakręt. po każdym teście musisz po prostu dodać ostatnią średnią ruchomą wartość do macierzy walcowniczej w pamięci. Używając tej metody nie przeliczasz już rzeczy, które już obliczyłeś: po pierwszym zaznaczyć cumsum po tym, jak po prostu dodaj cytat ostatniego elementu itemsquot, który jest szybszy o 2x dla wszystkich kolejnych kleszczy. ndash litepresence Jun 10 16 at 12:29 Jeśli zdecydujesz się na własne, a nie korzystać z istniejącej biblioteki, bądź świadomy błędów zmiennoprzecinkowych i spróbuj zminimalizować jego efekty: Jeśli wszystkie wartości są mniej więcej taki sam rząd wielkości , to pomoże to zachować precyzję, dodając zawsze wartości o przybliżeniu wielkości. W moim ostatnim zdaniu próbowałem wskazać, dlaczego pomaga błąd zmiennoprzecinkowy. Jeśli dwie wartości są w przybliżeniu o ten sam rząd wielkości, to dodanie ich traci mniejszą precyzję niż w przypadku dodania bardzo dużej liczby do bardzo małej. Kod łączy wartości sąsiadujące z wartościami w taki sposób, że nawet sumy pośrednie powinny zawsze być w przybliżeniu w wielkości, aby zminimalizować błąd zmiennoprzecinkowy. Nic nie jest głupcem, ale ta metoda uratowała kilka bardzo słabo zrealizowanych projektów w produkcji. ndash Mayur Patel Dec 15 14 at 17:22 Alleo: Zamiast zrobić jeden dodatek na wartość, będziesz robi dwa. Dowód jest taki sam jak problem z odwzorowaniem bitów. Punktem tej odpowiedzi niekoniecznie jest wydajność, ale precyzja. Użycie pamięci dla uśrednionych 64-bitowych wartości nie przekraczałoby 64 elementów w pamięci podręcznej, a więc jest przyjazne w używaniu pamięci. ndash Mayur Patel 29 grudnia o godzinie 17:04
No comments:
Post a Comment