Mogę coś napisać samodzielnie, znajdując przecięcia zerowe pierwszej pochodnej lub czegoś w tym rodzaju, ale wydaje się, że jest to dość powszechna funkcja, którą można włączyć do standardowych bibliotek. Czy ktoś o jednym wie?
Moja konkretna aplikacja to tablica 2D, ale zwykle byłaby używana do znajdowania pików w FFT itp.
W szczególności w tego rodzaju problemach występuje wiele silnych szczytów, a następnie wiele mniejszych „szczytów”, które są spowodowane przez szum, który należy zignorować. To są tylko przykłady; nie moje rzeczywiste dane:
1-wymiarowe piki:
2-wymiarowe piki:
Algorytm znajdowania pików znalazłby lokalizację tych pików (nie tylko ich wartości), a idealnie by znalazłby prawdziwy pik między próbkami, a nie tylko indeks z wartością maksymalną, prawdopodobnie przy użyciu interpolacji kwadratowej lub czegoś podobnego.
Zwykle zależy Ci tylko na kilku mocnych pikach, więc zostaną wybrane albo dlatego, że przekraczają pewien próg, albo dlatego, że są pierwszymi n pikami uporządkowanej listy, uszeregowanymi według amplitudy.
Jak powiedziałem, sam wiem, jak napisać coś takiego. Pytam tylko, czy istnieje wcześniej istniejąca funkcja lub pakiet, o którym wiadomo, że działa dobrze.
Aktualizacja:
I przetłumaczony skrypt MATLAB i działa przyzwoicie dla przypadku 1-D, ale mogłoby być lepiej.
Zaktualizowana aktualizacja:
sixtenbe stworzył lepszą wersję dla obudowy 1-D.
źródło
find_peaks
, więc dodałem tę odpowiedź, która może być przydatna w przyszłości. (Jestem pewien, że już to znalazłeś od 2009 roku, ale to dla innych ludzi + dla siebie, kiedy zadam sobie to pytanie ponownie za kilka lat!)Odpowiedzi:
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 szczytów i odrzucenia zaszumionych szczytów.
Co to jest widoczność (topograficzna) ? Jest to „minimalna wysokość niezbędna do zejścia ze szczytu na wyższy teren” , jak widać tutaj:
Idea jest taka:
Test:
Celowo użyłem (hałaśliwej) sinusoidy o zmiennej częstotliwości, ponieważ wykazuje wiele trudności. Widzimy, że
width
parametr nie jest tutaj zbyt przydatny, ponieważ jeśli ustawisz minimumwidth
za wysokie, nie będzie w stanie śledzić bardzo bliskich pików w części o wysokiej częstotliwości. Jeśli ustawiszwidth
zbyt nisko, będziesz miał wiele niechcianych szczytów w lewej części sygnału. Ten sam problem zdistance
.threshold
porównuje się tylko z bezpośrednimi sąsiadami, co nie jest tutaj przydatne.prominence
jest tym, który daje najlepsze rozwiązanie. Pamiętaj, że możesz łączyć wiele z tych parametrów!Kod:
źródło
Patrzę na podobny problem i odkryłem, że niektóre z najlepszych odniesień pochodzą z chemii (z pików znalezionych w danych masowych). Aby uzyskać dokładny przegląd algorytmów wyszukiwania szczytów, przeczytaj to . To jedna z najlepszych i najbardziej przejrzystych recenzji technik znajdowania szczytów, z jakimi się spotkałem. (Wavelety są najlepsze do znajdowania pików tego rodzaju w zaszumionych danych).
Wygląda na to, że twoje szczyty są wyraźnie określone i nie są ukryte w szumie. W takim przypadku polecam użycie gładkich pochodnych savtizky-golay do znalezienia szczytów (jeśli po prostu rozróżnisz powyższe dane, będziesz miał bałagan fałszywych alarmów). Jest to bardzo skuteczna technika i dość łatwa do wdrożenia (potrzebujesz klasy macierzy z podstawowymi operacjami). Jeśli po prostu znajdziesz przejście przez zero pierwszej pochodnej SG, myślę, że będziesz szczęśliwy.
źródło
W Scipy jest funkcja o nazwie,
scipy.signal.find_peaks_cwt
która wydaje się być odpowiednia dla Twoich potrzeb, jednak nie mam z nią doświadczenia, więc nie mogę jej polecić.http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
źródło
Dla tych, którzy nie są pewni, które algorytmy znajdowania szczytów mają być używane w Pythonie, tutaj szybki przegląd alternatyw: https://github.com/MonsieurV/py-findpeaks
Chcąc być odpowiednikiem
findpeaks
funkcji MatLab , odkryłem, że funkcja Discover_peaks Marcosa Duarte to dobry chwyt.Całkiem łatwy w użyciu:
Co da ci:
źródło
find_peaks
funkcja została dodana doscipy
.Wykrywanie pików w widmie w wiarygodny sposób było przedmiotem wielu badań, na przykład wszystkie prace nad modelowaniem sinusoidalnym dla sygnałów muzycznych / audio w latach 80-tych. Szukaj w literaturze tematu „Modelowanie sinusoidalne”.
Jeśli twoje sygnały są tak czyste, jak na przykładzie, proste „daj mi coś o amplitudzie większej niż N sąsiadów” powinno działać dość dobrze. Jeśli masz zakłócone sygnały, prostym, ale skutecznym sposobem jest spojrzenie na swoje piki w czasie, aby je śledzić: następnie wykrywasz linie widmowe zamiast szczytów widmowych. IOW, obliczasz FFT na przesuwanym oknie twojego sygnału, aby otrzymać zestaw widma w czasie (zwany również spektrogramem). Następnie przyjrzyj się ewolucji piku widmowego w czasie (tj. W kolejnych oknach).
źródło
Nie sądzę, że to, czego szukasz, jest dostarczane przez SciPy. W takiej sytuacji sam napisałbym kod.
Interpolacja splajnu i wygładzanie z scipy.interpolate są całkiem przyjemne i mogą być całkiem pomocne w dopasowywaniu szczytów, a następnie znajdowaniu lokalizacji ich maksimum.
źródło
Istnieją standardowe funkcje statystyczne i metody wyszukiwania wartości odstających względem danych, co prawdopodobnie jest tym, czego potrzebujesz w pierwszym przypadku. Używanie pochodnych rozwiązałoby twoją sekundę. Nie jestem jednak pewien metody, która rozwiązuje zarówno funkcje ciągłe, jak i próbkowane dane.
źródło
Po pierwsze, definicja „wartości szczytowej” jest niejasna, jeśli nie ma dalszych specyfikacji. Na przykład, w następującej serii, czy nazwałbyś 5-4-5 jeden szczyt czy dwa?
1-2-1-2-1-1-5-4-5-1-1-5-1
W takim przypadku będziesz potrzebować co najmniej dwóch progów: 1) tylko wysoki próg, powyżej którego może rejestrować wartość ekstremalną jako wartość szczytową; i 2) niski próg, tak aby skrajne wartości oddzielone małymi wartościami poniżej niego stały się dwoma szczytami.
Wykrywanie pików jest dobrze zbadanym tematem w literaturze dotyczącej teorii wartości ekstremalnych, znanym również jako „deklasteryzacja wartości ekstremalnych”. Jego typowe zastosowania obejmują identyfikację zdarzeń niebezpiecznych w oparciu o ciągłe odczyty zmiennych środowiskowych, np. Analizę prędkości wiatru w celu wykrycia zdarzeń burzowych.
źródło