Eu mesmo posso escrever algo encontrando cruzamentos zero da primeira derivada ou algo assim, mas parece uma função suficientemente comum para ser incluída nas bibliotecas padrão. Alguém conhece um?
Minha aplicação em particular é uma matriz 2D, mas geralmente seria usada para encontrar picos em FFTs, etc.
Especificamente, nesses tipos de problemas, existem vários picos fortes e, em seguida, muitos "picos" menores que são causados apenas por ruídos que devem ser ignorados. Estes são apenas exemplos; não meus dados reais:
Picos unidimensionais:
Picos bidimensionais:
O algoritmo de localização de pico encontraria a localização desses picos (não apenas seus valores) e, idealmente, encontraria o verdadeiro pico entre amostras, não apenas o índice com valor máximo, provavelmente usando interpolação quadrática ou algo assim.
Normalmente, você se preocupa apenas com alguns picos fortes, para que eles sejam escolhidos porque estão acima de um determinado limite ou porque são os primeiros n picos de uma lista ordenada, classificados por amplitude.
Como eu disse, sei escrever algo assim sozinho. Só estou perguntando se existe uma função ou pacote preexistente que funcione bem.
Atualizar:
I traduzido um script MATLAB e funciona decentemente para o caso 1-D, mas poderia ser melhor.
Atualização atualizada:
sixtenbe criou uma versão melhor para o gabinete 1-D.
fonte
find_peaks
, então adicionei esta resposta que pode ser útil para referência futura. (Eu tenho certeza que você já encontrou este desde 2009, mas é para outras pessoas + mim quando eu vou me fazer a pergunta novamente em alguns anos!)Respostas:
A função
scipy.signal.find_peaks
, como o próprio nome sugere, é útil para isso. Mas é importante entender bem seus parâmetroswidth
ethreshold
,distance
acima de tudo,prominence
obter uma boa extração de pico.De acordo com meus testes e a documentação, o conceito de destaque é "o conceito útil" para manter os bons picos e descartar os barulhentos.
O que é destaque (topográfico) ? É "a altura mínima necessária para descer do topo até qualquer terreno mais alto" , como pode ser visto aqui:
A ideia é:
Teste:
Eu usei um sinusóide (barulhento) com variação de frequência de propósito, porque mostra muitas dificuldades. Podemos ver que o
width
parâmetro não é muito útil aqui, porque se você definir um mínimowidth
muito alto, ele não poderá rastrear picos muito próximos na parte de alta frequência. Se você definirwidth
muito baixo, terá muitos picos indesejados na parte esquerda do sinal. Mesmo problema comdistance
.threshold
só se compara aos vizinhos diretos, o que não é útil aqui.prominence
é o que dá a melhor solução. Observe que você pode combinar muitos desses parâmetros!Código:
fonte
Estou procurando um problema semelhante e descobri que algumas das melhores referências vêm da química (de picos encontrados em dados de especificações de massa). Para uma boa revisão completa dos picos de algoritmos de localização, leia isto . Essa é uma das melhores análises mais claras das técnicas de detecção de pico que eu já deparei. (As wavelets são as melhores para encontrar picos desse tipo em dados ruidosos.).
Parece que seus picos estão claramente definidos e não estão escondidos no barulho. Sendo esse o caso, recomendo o uso de derivativos savtizky-golay suaves para encontrar os picos (se você apenas diferenciar os dados acima, terá uma bagunça de falsos positivos.). Essa é uma técnica muito eficaz e é muito fácil de implementar (você precisa de uma classe de matriz com operações básicas). Se você simplesmente encontrar o cruzamento zero do primeiro derivado SG, acho que ficará feliz.
fonte
Existe uma função no scipy chamada
scipy.signal.find_peaks_cwt
que parece adequada às suas necessidades, no entanto, não tenho experiência com ela, portanto não posso recomendar.http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
fonte
Para quem não tem certeza sobre quais algoritmos de localização de pico usar no Python, aqui está uma rápida visão geral das alternativas: https://github.com/MonsieurV/py-findpeaks
Querendo um equivalente à
findpeaks
função MatLab , descobri que a função detect_peaks de Marcos Duarte é uma boa solução .Muito fácil de usar:
O que lhe dará:
fonte
find_peaks
função foi adicionada ascipy
.A detecção de picos em um espectro de maneira confiável tem sido bastante estudada, por exemplo, todo o trabalho em modelagem sinusoidal para sinais de música / áudio nos anos 80. Procure por "Modelagem Sinusoidal" na literatura.
Se seus sinais são tão limpos quanto o exemplo, um simples "me dê algo com uma amplitude maior que N vizinhos" deve funcionar razoavelmente bem. Se você possui sinais ruidosos, uma maneira simples, porém eficaz, é observar seus picos no tempo e segui-los: você detecta linhas espectrais em vez de picos espectrais. Como você calcula a FFT em uma janela deslizante do seu sinal, para obter um conjunto de espectro no tempo (também chamado espectrograma). Você observa a evolução do pico espectral no tempo (ou seja, em janelas consecutivas).
fonte
Não acho que o que você procura seja fornecido pelo SciPy. Eu mesmo escreveria o código nessa situação.
A interpolação e suavização da spline do scipy.interpolate são bastante agradáveis e podem ser bastante úteis para ajustar picos e, em seguida, encontrar a localização do seu máximo.
fonte
Existem funções e métodos estatísticos padrão para localizar dados discrepantes, o que provavelmente é o que você precisa no primeiro caso. Usar derivativos resolveria o seu segundo. Não tenho certeza de um método que resolva funções contínuas e dados amostrados, no entanto.
fonte
Para começar, a definição de "pico" é vaga, se não houver especificações adicionais. Por exemplo, para a série a seguir, você chamaria 5-4-5 de um ou dois picos?
1-2-1-2-1-1-5-4-5-1-1-5-1
Nesse caso, você precisará de pelo menos dois limites: 1) um limite alto apenas acima do qual um valor extremo possa ser registrado como um pico; e 2) um limite baixo para que valores extremos separados por pequenos valores abaixo dele se tornem dois picos.
A detecção de pico é um tópico bem estudado na literatura da teoria dos valores extremos, também conhecido como "decomposição de valores extremos". Suas aplicações típicas incluem a identificação de eventos de risco com base em leituras contínuas de variáveis ambientais, por exemplo, análise da velocidade do vento para detectar eventos de tempestade.
fonte