Aktualizacja: Jak dotąd najlepiej działającym algorytmem jest ten .
To pytanie bada niezawodne algorytmy do wykrywania nagłych szczytów w danych szeregów czasowych w czasie rzeczywistym.
Rozważ następujący zestaw danych:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 2 2.5 1 1 1];
(Format Matlab, ale nie chodzi o język, ale o algorytm)
Wyraźnie widać, że istnieją trzy duże szczyty i niektóre małe szczyty. Ten zestaw danych jest konkretnym przykładem klasy zestawów danych timeseries, o które chodzi w pytaniu. Ta klasa zestawów danych ma dwie ogólne cechy:
- Występuje podstawowy hałas o ogólnym znaczeniu
- Istnieją duże „ szczyty ” lub „ wyższe punkty danych ”, które znacznie odbiegają od hałasu.
Załóżmy również, że:
- szerokość pików nie może być wcześniej ustalona
- wysokość pików wyraźnie i znacząco odbiega od innych wartości
- używany algorytm musi obliczać w czasie rzeczywistym (więc zmieniaj z każdym nowym punktem danych)
W takiej sytuacji należy skonstruować wartość graniczną, która wyzwala sygnały. Jednak wartość granicy nie może być statyczna i musi być ustalana w czasie rzeczywistym na podstawie algorytmu.
Moje pytanie: jaki jest dobry algorytm do obliczania takich progów w czasie rzeczywistym? Czy istnieją specjalne algorytmy dla takich sytuacji? Jakie są najbardziej znane algorytmy?
Wysoko cenione są solidne algorytmy lub przydatne informacje. (może odpowiedzieć w dowolnym języku: chodzi o algorytm)
Odpowiedzi:
Solidny algorytm wykrywania pików (z wykorzystaniem wyników Z)
Wymyśliłem algorytm, który działa bardzo dobrze dla tego rodzaju zestawów danych. Opiera się on na zasadzie dyspersji : jeśli nowy punkt danych jest daną x liczbą standardowych odchyleń od pewnej średniej ruchomej, algorytm sygnalizuje (zwany również z-score ). Algorytm jest bardzo solidny, ponieważ konstruuje oddzielną średnią ruchomą i odchylenie, tak aby sygnały nie uszkodziły progu. Przyszłe sygnały są zatem identyfikowane z mniej więcej taką samą dokładnością, niezależnie od ilości wcześniejszych sygnałów. Algorytm bierze 3 wejścia:
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
iinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Na przykład alag
z 5 użyje ostatnich 5 obserwacji do wygładzenia danych. ZAthreshold
z 3,5 zasygnalizuje, że punkt danych znajduje się 3,5 standardowego odchylenia od średniej ruchomej. Ainfluence
z 0,5 daje sygnałowi połowę wpływu, jaki mają normalne punkty danych. Podobnie,influence
z 0 całkowicie ignoruje sygnały do ponownego obliczenia nowego progu. Wpływ 0 jest zatem najbardziej niezawodną opcją (ale zakłada stacjonarność ); ustawienie opcji wpływu na 1 jest najmniej niezawodne. W przypadku danych niestacjonarnych opcję wpływu należy zatem umieścić gdzieś pomiędzy 0 a 1.Działa w następujący sposób:
Pseudo kod
Poniżej znajdują się praktyczne zasady wyboru dobrych parametrów dla danych.
Próbny
Kod Matlab dla tego dema można znaleźć tutaj . Aby skorzystać z wersji demo, po prostu uruchom ją i utwórz szereg czasowy, klikając górny wykres. Algorytm zaczyna działać po narysowaniu
lag
liczby obserwacji.Wynik
W przypadku pierwotnego pytania ten algorytm daje następujące dane wyjściowe przy użyciu następujących ustawień
lag = 30, threshold = 5, influence = 0
:Implementacje w różnych językach programowania:
Matlab (ja)
R (ja)
Golang (Xeoncross)
Python (R Kiselev)
Python [wydajna wersja] (delica)
Szybki (ja)
Groovy (JoshuaCWebDeveloper)
C ++ (brad)
C ++ (Animesh Pandey)
Rdza (swizard)
Scala (Mike Roberts)
Kotlin (leoderprofi)
Ruby (Kimmo Lehto)
Fortran [do wykrywania rezonansu] (THo)
Julia (Matt Camp)
C # (Ocean Airdrop)
C (DavidC)
Java (takanuva15)
JavaScript (Dirk Lüsebrink)
TypeScript (Jerry Gamble)
Perl (Alen)
PHP (radhoo)
Praktyczne zasady konfigurowania algorytmu
lag
: parametr lag określa, o ile dane zostaną wygładzone i jak adaptacyjny jest algorytm do zmian średniej długoterminowej danych. Im bardziej stacjonarne są twoje dane, tym więcej opóźnień powinieneś uwzględnić (powinno to poprawić niezawodność algorytmu). Jeśli Twoje dane zawierają trendy zmieniające się w czasie, powinieneś rozważyć, jak szybko algorytm musi się dostosować do tych trendów. To znaczy, jeśli ustawiszlag
na 10, zajmie to 10 „okresów”, zanim próg algorytmu zostanie dostosowany do wszelkich systematycznych zmian średniej długoterminowej. Wybierz więclag
parametr na podstawie trendu zachowania danych i tego, jak elastyczny ma być algorytm.influence
: ten parametr określa wpływ sygnałów na próg detekcji algorytmu. Jeśli ustawione na 0, sygnały nie mają wpływu na wartość progową, tak że przyszłe sygnały są wykrywane na podstawie wartości progowej, która jest obliczana ze średniej i odchylenia standardowego, na które nie mają wpływu sygnały z przeszłości. Innym sposobem myślenia o tym jest to, że jeśli ustawisz wpływ na 0, domyślnie przyjmiesz stacjonarność (tj. Bez względu na liczbę sygnałów, szeregi czasowe zawsze wracają do tej samej średniej w dłuższej perspektywie). Jeśli tak nie jest, parametr wpływu należy umieścić gdzieś pomiędzy 0 a 1, w zależności od stopnia, w jakim sygnały mogą systematycznie wpływać na zmieniający się w czasie trend danych. Np. Jeśli sygnały prowadzą do pęknięcia strukturalnego średniej długoterminowej szeregu czasowego parametr wpływu należy ustawić na wysokim poziomie (blisko 1), aby próg mógł szybko dostosować się do tych zmian.threshold
: parametr progowy to liczba odchyleń standardowych od średniej ruchomej, powyżej której algorytm sklasyfikuje nowy punkt danych jako sygnał. Na przykład, jeśli nowy punkt danych ma 4,0 odchylenia standardowe powyżej średniej ruchomej, a parametr progowy ustawiony jest na 3,5, algorytm zidentyfikuje punkt danych jako sygnał. Ten parametr należy ustawić na podstawie oczekiwanej liczby sygnałów. Na przykład, jeśli dane są normalnie dystrybuowane, próg (lub: wynik-Z) wynoszący 3,5 odpowiada prawdopodobieństwu sygnalizacyjnemu wynoszącemu 0,00047 (z tej tabeli), co oznacza, że oczekujesz sygnału raz na 2128 punktów danych (1 / 0,00047). Próg wpływa zatem bezpośrednio na czułość algorytmu, a tym samym także na częstotliwość sygnałów. Zbadaj własne dane i określ rozsądny próg, który sygnalizuje algorytmowi, kiedy tego chcesz (może być potrzebna próba i błąd, aby uzyskać dobry próg dla twojego celu).OSTRZEŻENIE: Powyższy kod zawsze zapętla wszystkie punkty danych przy każdym uruchomieniu. Wdrażając ten kod, pamiętaj o podzieleniu obliczeń sygnału na osobną funkcję (bez pętli). Wtedy, gdy nowy Datapoint przybywa, aktualizacja
filteredY
,avgFilter
astdFilter
raz. Nie przeliczaj sygnałów dla wszystkich danych za każdym razem, gdy pojawia się nowy punkt danych (jak w powyższym przykładzie), który byłby wyjątkowo nieefektywny i powolny!Inne sposoby modyfikacji algorytmu (w celu potencjalnych ulepszeń) to:
influence
parametr dla średniej i standardowej wartości ( tak jak w tym tłumaczeniu Swift )(Znane) cytaty naukowe do tej odpowiedzi StackOverflow:
Yin, C. (2020). Dinukleotyd powtarza się w genomie koronawirusa SARS-CoV-2: implikacje ewolucyjne . E-druk ArXiv, dostępny na stronie : https://arxiv.org/pdf/2006.00280.pdf
Esnaola-Gonzalez, I., Gómez-Omella, M., Ferreiro, S., Fernandez, I., Lázaro, I., i García, E. (2020). Platforma IoT w kierunku poprawy łańcuchów produkcji drobiu . Czujniki, 20 (6), 1549.
Gao, S. i Calderon, DP (2020). Ciągłe schematy integracji korowo-ruchowej kalibrują poziomy pobudzenia podczas wychodzenia ze znieczulenia . bioRxiv.
Cloud, B., Tarien, B., Liu, A., Shedd, T., Lin, X., Hubbard, M., ... & Moore, JK (2019). Adaptacyjne połączenie czujników oparte na smartfonach do szacowania wskaźników kinematycznych w wioślarstwie . PloS One, 14 (12).
Ceyssens, F., Carmona, MB, Kil, D., Deprez, M., Tooten, E., Nuttin, B., ... & Puers, R. (2019). Przewlekłe rejestrowanie neuronowe za pomocą sond o przekroju subkomórkowym z wykorzystaniem 0,6 mm² rozpuszczających mikrogłowice jako urządzenia wprowadzającego . Czujniki i urządzenia wykonawcze B: chemiczne , 284, str. 369–376.
Dons, E., Laeremans, M., Orjuela, JP, Avila-Palencia, I., de Nazelle, A., Nieuwenhuijsen, M., ... & Nawrot, T. (2019). Transport najprawdopodobniej spowoduje szczytowe narażenie na zanieczyszczenie powietrza w życiu codziennym: dowody z ponad 2000 dni osobistego monitorowania . Atmosferyczne środowisko , 213, 424-432.
Schaible BJ, Snook KR, Yin J. i in. (2019). Rozmowy na Twitterze i angielskie media w mediach na temat poliomyelitis w pięciu różnych krajach, od stycznia 2014 do kwietnia 2015 . The Permanente Journal , 23, 18-181.
Lima, B. (2019). Eksploracja powierzchni obiektu za pomocą robota dotykowego z włączonymi palcami (rozprawa doktorska, Université d'Ottawa / University of Ottawa).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP i Petriu, EM (2019). Tętno Wykrywanie Korzystanie multimodalnego Dotykowe Sensor i Z-score Based Szczyt Detection Algorithm . Postępowanie CMBES , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, wiceprezes, Zhu, Q., Goubran, M., Groza, VZ i Petriu, EM (2019, czerwiec). Wykrywanie tętna za pomocą zminimalizowanego multimodalnego czujnika dotykowego . W 2019 r. Międzynarodowe sympozjum IEEE na temat pomiarów i aplikacji medycznych (MeMeA) (s. 1-6). IEEE.
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Uogólnione wykrywanie granic za pomocą analizy opartej na kompresji . ICASSP 2019-2019 Międzynarodowa konferencja IEEE na temat akustyki, przetwarzania mowy i sygnałów (ICASSP) , Brighton, Wielka Brytania, s. 3522–3526.
Przewoźnik, EE (2019). Wykorzystanie kompresji w rozwiązywaniu dyskretnych układów liniowych . Rozprawa doktorska , University of Illinois at Urbana-Champaign.
Khandakar, A., Chowdhury, ME, Ahmed, R., Dhib, A., Mohammed, M., Al-Emadi, NA i Michelson, D. (2019). Przenośny system monitorowania i kontrolowania zachowania kierowcy oraz korzystania z telefonu komórkowego podczas jazdy . Sensors , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott, L., Clark, AJ, ... & Orengo, C. (2019). Kompleksowa analiza długiej niekodującej ekspresji RNA w zwoju korzenia grzbietowego ujawnia swoistość typu komórki i rozregulowanie po uszkodzeniu nerwu . Ból , 160 (2), 463.
Cloud, B., Tarien, B., Crawford, R., & Moore, J. (2018). Adaptacyjne połączenie czujników oparte na smartfonach do szacowania wskaźników kinematycznych w wioślarstwie . engrXiv Preprints .
Zajdel, TJ (2018). Elektroniczne interfejsy do bioczujników opartych na bakteriach . Rozprawa doktorska , UC Berkeley.
Perkins, P., Heber, S. (2018). Identyfikacja miejsc pauzy rybosomów za pomocą algorytmu wykrywania pików opartego na Z-score . 8 Międzynarodowa Konferencja IEEE nt. Postępów Obliczeniowych w Biologii i Naukach Medycznych (ICCABS) , ISBN: 978-1-5386-8520-4.
Moore, J., Goffin, P., Meyer, M., Lundrigan, P., Patwari, N., Sward, K., i Wiese, J. (2018). Zarządzanie środowiskami domowymi poprzez wykrywanie, opisywanie i wizualizowanie danych dotyczących jakości powietrza . Postępowanie ACM w zakresie technologii interaktywnych, mobilnych, poręcznych i wszechobecnych , 2 (3), 128.
Lo, O., Buchanan, WJ, Griffiths, P. i Macfarlane, R. (2018), Metody pomiaru odległości w celu lepszego wykrywania zagrożeń wewnętrznych , sieci bezpieczeństwa i komunikacji , t. 2018, ID artykułu 5906368.
Apurupa, NV, Singh, P., Chakravarthy, S., & Buduru, AB (2018). Krytyczne badanie wzorców zużycia energii w Indian Apartments . Rozprawa doktorska , IIIT-Delhi.
Scirea, M. (2017). Affective Music Generation i jego wpływ na wrażenia gracza . Rozprawa doktorska , IT University of Copenhagen, Digital Design.
Scirea, M., Eklund, P., Togelius, J., i Risi, S. (2017). Primal-Improv: W stronę koewolucyjnej improwizacji muzycznej . Informatyka i inżynieria elektroniczna (CEEC) , 2017 (ss. 172-177). IEEE.
Catalbas, MC, Cegovnik, T., Sodnik, J. and Gulten, A. (2017). Wykrywanie zmęczenia kierowcy w oparciu o sakadyczne ruchy gałek ocznych , 10. Międzynarodowa Konferencja Inżynierii Elektrycznej i Elektronicznej (ELECO), s. 913–917.
Inna praca przy użyciu algorytmu
Bernardi, D. (2019). Studium wykonalności dotyczące parowania smartwatcha i urządzenia mobilnego za pomocą gestów multimodalnych . Praca magisterska , Uniwersytet Aalto.
Lemmens, E. (2018). Wykrywanie wartości odstających w dziennikach zdarzeń za pomocą metod statystycznych , praca magisterska , University of Eindhoven.
Willems, P. (2017). Nastrojowe nastroje afektywne dla osób starszych , praca magisterska , University of Twente.
Ciocirdel, GD i Varga, M. (2016). Prognozy wyborcze na podstawie odsłon strony w Wikipedii . Dokument projektowy , Vrije Universiteit Amsterdam.
Inne zastosowania tego algorytmu
Machine Learning Financial Laboratory , pakiet Python na podstawie pracy De Prado, ML (2018). Postępy w uczeniu się maszyn finansowych . John Wiley & Sons.
Adafruit CircuitPlayground Library , Adafruit board (Adafruit Industries)
Algorytm śledzenia kroków , aplikacja na Androida (jeeshnair)
Linki do innych algorytmów wykrywania pików
Jeśli gdzieś skorzystasz z tej funkcji, proszę o kredyt lub tę odpowiedź. Jeśli masz jakieś pytania dotyczące tego algorytmu, opublikuj je w komentarzach poniżej lub skontaktuj się ze mną na LinkedIn .
źródło
threshold
wykres staje się płaską zieloną linią po dużym skoku do 20 w danych i pozostaje taki przez resztę wykresu ... Jeśli Usuwam sike, tak się nie dzieje, więc wydaje się, że jest to spowodowane skokiem danych. Masz pomysł, co się dzieje? Jestem nowicjuszem w Matlabie, więc nie mogę tego rozgryźć ...Oto implementacja
Python
/numpy
wygładzonego algorytmu Z-score (patrz odpowiedź powyżej ). Można znaleźć sedno tutaj .Poniżej znajduje się test na tym samym zestawie danych, który daje taki sam wykres jak w oryginalnej odpowiedzi na
R
/Matlab
źródło
y
oznacza macierz danych można przejść w,signals
to+1
albo-1
tablica wyjście, które wskazują na każdym Datapointy[i]
czy Datapoint jest „znacząca szczytowa” Biorąc pod uwagę ustawienia użyć.Jednym z podejść jest wykrywanie pików na podstawie następującej obserwacji:
Unika fałszywych trafień, czekając, aż trend wzrostowy się skończy. Nie jest to dokładnie „w czasie rzeczywistym” w tym sensie, że spóźni się o szczyt o jeden dt. czułość można kontrolować, wymagając marginesu dla porównania. Istnieje kompromis między głośnym wykrywaniem a opóźnieniem czasowym wykrycia. Możesz wzbogacić model, dodając więcej parametrów:
gdzie DT i m są parametrami do kontroli czułości w funkcji czasu opóźnienia
Oto, co otrzymujesz dzięki wspomnianemu algorytmowi:
oto kod do odtworzenia wykresu w Pythonie:
Ustawiając
m = 0.5
, możesz uzyskać czystszy sygnał z tylko jednym fałszywie dodatnim:źródło
W przetwarzaniu sygnału wykrywanie pików często odbywa się za pomocą transformaty falkowej. Zasadniczo wykonujesz dyskretną transformatę falkową na danych szeregów czasowych. Zerowane przecięcia w zwracanych współczynnikach szczegółowych będą odpowiadać pikom w sygnale szeregów czasowych. Otrzymujesz różne amplitudy pików wykrywane przy różnych poziomach współczynnika szczegółowości, co daje rozdzielczość wielopoziomową.
źródło
Podjęliśmy próbę zastosowania wygładzonego algorytmu Z-score w naszym zestawie danych, co powoduje albo nadwrażliwość, albo nadwrażliwość (w zależności od tego, jak parametry są dostrojone), z niewielkim pośrednim poziomem. W sygnalizacji ruchu na naszej stronie zaobserwowaliśmy linię bazową niskiej częstotliwości, która reprezentuje cykl dzienny, a nawet przy najlepszych możliwych parametrach (pokazanych poniżej), nadal występowała, szczególnie czwartego dnia, ponieważ większość punktów danych jest rozpoznawana jako anomalia .
Opierając się na oryginalnym algorytmie Z-score, znaleźliśmy sposób na rozwiązanie tego problemu przez filtrowanie wsteczne. Szczegóły zmodyfikowanego algorytmu i jego zastosowania do komercyjnego przypisywania ruchu telewizyjnego są publikowane na blogu naszego zespołu .
źródło
W topologii obliczeniowej idea trwałej homologii prowadzi do wydajnego - szybkiego jak sortowanie liczb - rozwiązania. Nie tylko wykrywa szczyty, ale w naturalny sposób określa ilościowo „znaczenie” pików, co pozwala wybrać piki, które są dla Ciebie znaczące.
Podsumowanie algorytmu. W ustawieniu 1-wymiarowym (szeregi czasowe, sygnał wartości rzeczywistej) algorytm można łatwo opisać na poniższym rysunku:
Pomyśl o wykresie funkcji (lub jego zestawie podpoziomowym) jako krajobrazie i rozważ obniżający się poziom wody, poczynając od poziomu nieskończoności (lub 1,8 na tym zdjęciu). Podczas gdy poziom spada, na lokalnych maksymach wyskakują. W lokalnych minimach wyspy te łączą się ze sobą. Jednym ze szczegółów tego pomysłu jest to, że wyspa, która pojawiła się później, połączona jest ze starszą wyspą. „Trwałość” wyspy to czas jej narodzin minus czas jej śmierci. Długości niebieskich słupków obrazują trwałość, która jest wyżej wspomnianym „znaczeniem” piku.
Wydajność. Nietrudno jest znaleźć implementację działającą w czasie liniowym - w rzeczywistości jest to pojedyncza, prosta pętla - po posortowaniu wartości funkcji. Dlatego wdrożenie to powinno być szybkie w praktyce i łatwe do wdrożenia.
Bibliografia. Podsumowanie całej historii i odniesienia do motywacji z trwałej homologii (pole w obliczeniowej topologii algebraicznej) można znaleźć tutaj: https://www.sthu.org/blog/13-perstopology-peakdetection/index.html
źródło
Znalazłem inny algorytm GH Palshikara w Prostych algorytmach wykrywania pików w szeregach czasowych .
Algorytm wygląda następująco:
Zalety
Niedogodności
k
ih
wcześniejPrzykład:
źródło
Oto implementacja algorytmu wygładzonego z-score (powyżej) w Golang. Zakłada kawałek
[]int16
(16-bitowe próbki PCM). Tutaj znajdziesz sedno .źródło
Oto implementacja wygładzonego algorytmu z-score C ++ z tej odpowiedzi
źródło
Ten problem wygląda podobnie do tego, który napotkałem na kursie systemów hybrydowych / wbudowanych, ale był związany z wykrywaniem błędów, gdy sygnał wejściowy z czujnika jest głośny. Zastosowaliśmy filtr Kalmana, aby oszacować / przewidzieć ukryty stan systemu, a następnie zastosowaliśmy analizę statystyczną, aby określić prawdopodobieństwo wystąpienia usterki . Pracowaliśmy z układami liniowymi, ale istnieją warianty nieliniowe. Pamiętam, że to podejście było zaskakująco adaptacyjne, ale wymagało modelu dynamiki systemu.
źródło
Implementacja C ++
źródło
Kontynuując zaproponowane rozwiązanie @ Jean-Paula, zaimplementowałem jego algorytm w C #
Przykładowe użycie:
źródło
Oto implementacja C wygładzonego wyniku Z @ Jean-Paula dla mikrokontrolera Arduino wykorzystywanego do odczytu odczytów akcelerometru i decydowania, czy kierunek uderzenia pochodzi z lewej, czy z prawej strony. Działa to naprawdę dobrze, ponieważ to urządzenie zwraca odbity sygnał. Oto dane wejściowe do tego algorytmu wykrywania pików z urządzenia - pokazujące uderzenie z prawej strony, a następnie uderzenie z lewej. Możesz zobaczyć początkowy skok, a następnie oscylację czujnika.
Jej wynik to wpływ = 0
Nie wspaniale, ale tutaj z wpływem = 1
co jest bardzo dobre.
źródło
Oto rzeczywista implementacja Java oparta na odpowiedzi Groovy opublikowanej wcześniej . (Wiem, że są już publikowane implementacje Groovy i Kotlin, ale dla kogoś takiego jak ja, który tylko napisał Javę, trudno jest znaleźć sposób na konwersję między innymi językami i Javą).
(Wyniki pasują do wykresów innych osób)
Implementacja algorytmu
Główna metoda
Wyniki
źródło
Dodatek 1 do oryginalnej odpowiedzi:
Matlab
iR
tłumaczeniaKod Matlab
Przykład:
Kod R.
Przykład:
Ten kod (oba języki) da następujący wynik dla danych pierwotnego pytania:
Dodatek 2 do oryginalnej odpowiedzi:
Matlab
kod demonstracyjny(kliknij, aby utworzyć dane)
źródło
Oto moja próba stworzenia rozwiązania Ruby dla „Wygładzonego z-score algo” z zaakceptowanej odpowiedzi:
I przykładowe użycie:
źródło
Wersja iteracyjna w python / numpy dla odpowiedzi https://stackoverflow.com/a/22640362/6029703 jest tutaj. Ten kod jest szybszy niż średnia obliczeniowa i odchylenie standardowe przy każdym opóźnieniu dla dużych danych (100000+).
źródło
Pomyślałem, że zapewnię moją implementację algorytmu Julii dla innych. Istotę można znaleźć tutaj
źródło
Oto implementacja wygładzonego algorytmu Z-score Groovy (Java) ( patrz odpowiedź powyżej ).
Poniżej znajduje się test na tym samym zestawie danych, który daje takie same wyniki jak powyższa implementacja Python / numpy .
źródło
Oto (nieidiomatyczna) wersja Scala wygładzonego algorytmu Z-score :
Oto test, który zwraca takie same wyniki jak wersje Python i Groovy:
Gist tutaj
źródło
Potrzebowałem czegoś takiego w moim projekcie na Androida. Pomyślałem, że mogę oddać implementację Kotlina .
przykładowy projekt z wykresami weryfikacyjnymi można znaleźć na github .
źródło
Oto zmieniona wersja algorytmu z-score Fortrana . Jest on zmieniany specjalnie dla detekcji piku (rezonansu) w funkcjach przenoszenia w przestrzeni częstotliwości (każda zmiana ma mały komentarz w kodzie).
Pierwsza modyfikacja ostrzega użytkownika, jeśli w pobliżu dolnej granicy wektora wejściowego występuje rezonans, wskazany przez odchylenie standardowe wyższe niż określony próg (w tym przypadku 10%). Oznacza to po prostu, że sygnał nie jest wystarczająco płaski, aby detekcja prawidłowo zainicjowała filtry.
Druga modyfikacja polega na tym, że tylko najwyższa wartość piku jest dodawana do znalezionych pików. Osiąga się to poprzez porównanie każdej znalezionej wartości szczytowej z wielkością jej (opóźnionych) poprzedników i jej (opóźnionych) następców.
Trzecią zmianą jest uwzględnienie, że piki rezonansowe zwykle wykazują pewną formę symetrii wokół częstotliwości rezonansowej. Zatem naturalne jest obliczanie średniej i standardowej symetrycznie wokół bieżącego punktu danych (a nie tylko dla poprzedników). Powoduje to lepsze zachowanie w zakresie wykrywania pików.
Modyfikacje powodują, że cały sygnał musi być wcześniej znany funkcji, co jest typowym przypadkiem wykrywania rezonansu (coś w rodzaju Matlaba, przykład Jean-Paula, w którym punkty danych są generowane w locie, nie zadziała).
W mojej aplikacji algorytm działa jak urok!
źródło
Jeśli masz dane w tabeli bazy danych, oto wersja SQL prostego algorytmu z-score:
źródło
Wersja Python, która działa ze strumieniami w czasie rzeczywistym (nie przelicza wszystkich punktów danych po przybyciu każdego nowego punktu danych). Możesz dostosować to, co zwraca funkcja klasy - do moich celów potrzebowałem tylko sygnałów.
źródło
Pozwoliłem sobie na stworzenie wersji javascript. Może to być pomocne. Javascript powinien być bezpośrednią transkrypcją Pseudokodu podanego powyżej. Dostępne jako pakiet npm i repozytorium github:
Tłumaczenie Javascript:
źródło
Jeśli wartość graniczna lub inne kryteria zależą od przyszłych wartości, wówczas jedynym rozwiązaniem (bez wehikułu czasu lub innej wiedzy o przyszłych wartościach) jest opóźnienie jakiejkolwiek decyzji do momentu uzyskania wystarczających przyszłych wartości. Jeśli chcesz poziom powyżej średniej, która obejmuje na przykład 20 punktów, musisz poczekać, aż będziesz miał co najmniej 19 punktów przed jakąkolwiek szczytową decyzją, w przeciwnym razie następny nowy punkt może całkowicie zejść z progu 19 punktów temu .
Twój aktualny wykres nie ma żadnych szczytów ... chyba że z góry wiesz, że następnym punktem nie jest 1e99, który po przeskalowaniu wymiaru Y wykresu byłby płaski do tego punktu.
źródło
.. As large as in the picture
mi chodziło: o podobnych sytuacjach, w których istnieją znaczące szczyty i podstawowy poziom hałasu.I tu jest implementacja PHP ZSCORE algo:
źródło
($len - 1)
zamiast$len
wstddev()
Zamiast porównywać maksima ze średnią, można również porównać maksima z sąsiadującymi minimami, w których minima są zdefiniowane tylko powyżej progu hałasu. Jeśli lokalne maksimum jest> 3 razy (lub inny współczynnik ufności) albo sąsiadujące minima, to maksima te są pikiem. Określanie pików jest dokładniejsze w przypadku szerszych ruchomych okien. Nawiasem mówiąc, powyższe wykorzystuje obliczenia wyśrodkowane na środku okna, a nie obliczenia na końcu okna (== lag).
Zauważ, że maksima należy postrzegać jako wzrost sygnału przed i spadek po.
źródło
Funkcja
scipy.signal.find_peaks
, jak sama nazwa wskazuje, jest do tego przydatna. Ale ważne jest, aby dobrze zrozumieć jego parametrywidth
,threshold
,distance
a przede wszystkimprominence
, aby uzyskać dobry ekstrakcji szczytową.Zgodnie z moimi testami i dokumentacją, koncepcja wyeksponowania jest „użyteczną koncepcją” do utrzymania dobrych pików i odrzucenia hałaśliwych pików.
Jakie jest znaczenie (topograficzne) ? Jest to „minimalna wysokość niezbędna do zejścia ze szczytu na dowolny wyższy teren” , jak widać tutaj:
Chodzi o to:
źródło
Obiektowa wersja algorytmu z-score wykorzystująca mordern C +++
źródło
filtered_signal
,signal
,avg_filtered
istd_filtered
zmienne jako prywatne i tylko aktualizuje te tablice raz , kiedy nowy Datapoint przybywa (obecnie pętle kod ponad wszystkich punktów danych za każdym razem to się nazywa). Poprawiłoby to wydajność twojego kodu i jeszcze lepiej odpowiada strukturze OOP.