Monday 4 December 2017

Średnio okno przenoszące numerycznie


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