Saya dapat menulis sesuatu sendiri dengan menemukan nol-penyilangan dari turunan pertama atau sesuatu, tetapi sepertinya fungsi yang cukup umum untuk dimasukkan dalam perpustakaan standar. Adakah yang tahu?
Aplikasi khusus saya adalah array 2D, tetapi biasanya akan digunakan untuk menemukan puncak di FFT, dll.
Secara khusus, dalam masalah seperti ini, ada beberapa puncak yang kuat, dan kemudian banyak "puncak" yang lebih kecil yang hanya disebabkan oleh kebisingan yang harus diabaikan. Ini hanya contoh; bukan data aktual saya:
Puncak 1 dimensi:
Puncak 2 dimensi:
Algoritma penemuan-puncak akan menemukan lokasi puncak-puncak ini (bukan hanya nilainya), dan idealnya akan menemukan puncak antar-sampel yang sebenarnya, bukan hanya indeks dengan nilai maksimum, mungkin menggunakan interpolasi kuadrat atau sesuatu.
Biasanya Anda hanya peduli tentang puncak yang kuat beberapa, sehingga mereka akan baik dipilih karena mereka di atas ambang tertentu, atau karena mereka yang pertama n puncak daftar ordered, berdasarkan peringkat amplitudo.
Seperti yang saya katakan, saya tahu bagaimana menulis sesuatu seperti ini sendiri. Saya hanya bertanya apakah ada fungsi atau paket yang sudah ada sebelumnya yang berfungsi dengan baik.
Memperbarui:
Saya menerjemahkan skrip MATLAB dan berfungsi dengan baik untuk kasus 1-D, tetapi bisa lebih baik.
Pembaruan yang diperbarui:
sixtenbe menciptakan versi yang lebih baik untuk case 1-D.
sumber
find_peaks
, jadi saya menambahkan jawaban ini yang mungkin berguna untuk referensi di masa mendatang. (Saya yakin Anda sudah menemukan ini sejak 2009 tetapi untuk orang lain + saya sendiri ketika saya akan mengajukan pertanyaan lagi kepada diri saya dalam beberapa tahun!)Jawaban:
Fungsi
scipy.signal.find_peaks
, seperti namanya, berguna untuk ini. Tapi itu penting untuk memahami dengan baik parameterwidth
,threshold
,distance
dan di atas semuaprominence
untuk mendapatkan ekstraksi puncak yang baik.Menurut tes dan dokumentasi saya, konsep menonjol adalah "konsep yang berguna" untuk menjaga puncak yang baik, dan membuang puncak yang bising.
Apa yang menonjol (topografi) ? Ini adalah "ketinggian minimum yang diperlukan untuk turun dari puncak ke medan yang lebih tinggi" , seperti yang dapat dilihat di sini:
Idenya adalah:
Uji:
Saya menggunakan sinusoid (noise) yang bervariasi-frekuensi dengan sengaja karena menunjukkan banyak kesulitan. Kita dapat melihat bahwa
width
parameter tidak terlalu berguna di sini karena jika Anda menetapkan minimumwidth
terlalu tinggi, maka itu tidak akan dapat melacak puncak yang sangat dekat di bagian frekuensi tinggi. Jika Anda menetapkanwidth
terlalu rendah, Anda akan memiliki banyak puncak yang tidak diinginkan di bagian kiri sinyal. Masalah yang sama dengandistance
.threshold
hanya membandingkan dengan tetangga langsung, yang tidak berguna di sini.prominence
adalah orang yang memberikan solusi terbaik. Perhatikan bahwa Anda dapat menggabungkan banyak parameter ini!Kode:
sumber
Saya melihat masalah yang sama, dan saya telah menemukan beberapa referensi terbaik berasal dari kimia (dari puncak yang ditemukan dalam data massa-spesifikasi). Untuk ulasan menyeluruh yang baik tentang algoritma pencarian puncak, baca ini . Ini adalah salah satu ulasan paling jelas terbaik dari teknik penemuan puncak yang pernah saya jumpai. (Wavelet adalah yang terbaik untuk menemukan puncak semacam ini dalam data berisik.).
Sepertinya puncak Anda didefinisikan dengan jelas dan tidak disembunyikan dalam kebisingan. Karena itu saya sarankan menggunakan derivatif savtizky-golay yang halus untuk menemukan puncak (Jika Anda hanya membedakan data di atas Anda akan memiliki kekacauan positif palsu.). Ini adalah teknik yang sangat efektif dan sangat mudah diimplementasikan (Anda perlu kelas matriks dengan operasi dasar). Jika Anda hanya menemukan zero crossing dari derivatif SG pertama, saya pikir Anda akan senang.
sumber
Ada fungsi dalam nama scipy
scipy.signal.find_peaks_cwt
yang kedengarannya cocok untuk kebutuhan Anda, namun saya tidak memiliki pengalaman dengannya jadi saya tidak bisa merekomendasikan ..http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html
sumber
Bagi mereka yang tidak yakin tentang algoritma pencarian-puncak mana yang akan digunakan dalam Python, di sini ikhtisar cepat alternatif: https://github.com/MonsieurV/py-findpeaks
Menginginkan diri saya setara dengan
findpeaks
fungsi MatLab , saya telah menemukan bahwa fungsi detect_peaks dari Marcos Duarte adalah tangkapan yang bagus.Cukup mudah digunakan:
Yang akan memberi Anda:
sumber
find_peaks
fungsi ditambahkan kescipy
.Mendeteksi puncak dalam spektrum dengan cara yang dapat diandalkan telah dipelajari sedikit, misalnya semua pekerjaan pada pemodelan sinusoidal untuk sinyal musik / audio di tahun 80-an. Cari "Pemodelan Sinusoidal" dalam literatur.
Jika sinyal Anda sebersih contoh, sederhana "beri saya sesuatu dengan amplitudo lebih tinggi dari tetangga N" harus bekerja dengan baik. Jika Anda memiliki sinyal bising, cara sederhana namun efektif adalah dengan melihat puncak waktu Anda, untuk melacaknya: Anda kemudian mendeteksi garis spektral dan bukan puncak spektral. TKI, Anda menghitung FFT pada jendela geser sinyal Anda, untuk mendapatkan satu set spektrum waktu (juga disebut spektrogram). Anda kemudian melihat evolusi puncak spektral dalam waktu (yaitu di jendela berturut-turut).
sumber
Saya tidak berpikir bahwa apa yang Anda cari disediakan oleh SciPy. Saya akan menulis kode sendiri, dalam situasi ini.
Interpolasi spline dan smoothing dari scipy.interpolasi cukup bagus dan mungkin cukup membantu dalam pemasangan puncak dan kemudian menemukan lokasi maksimum mereka.
sumber
Ada fungsi statistik standar dan metode untuk menemukan pencilan data, yang mungkin merupakan yang Anda butuhkan dalam kasus pertama. Menggunakan turunan akan memecahkan masalah Anda yang kedua. Saya tidak yakin untuk metode yang memecahkan fungsi kontinu dan data sampel.
sumber
Hal pertama yang pertama, definisi "puncak" tidak jelas jika tanpa spesifikasi lebih lanjut. Misalnya, untuk seri berikut, akankah Anda menelepon 5-4-5 satu atau dua puncak?
1-2-1-2-1-1-5-4-5-1-1-5-1-1
Dalam hal ini, Anda memerlukan setidaknya dua ambang batas: 1) ambang batas tinggi hanya di atas yang dapat mendaftarkan nilai ekstrim sebagai puncak; dan 2) ambang rendah sehingga nilai ekstrem yang dipisahkan oleh nilai kecil di bawahnya akan menjadi dua puncak.
Deteksi puncak adalah topik yang dipelajari dengan baik dalam literatur Teori Nilai Ekstrim, juga dikenal sebagai "declustering of extreme values". Aplikasi umumnya termasuk mengidentifikasi peristiwa bahaya berdasarkan pembacaan berkelanjutan variabel lingkungan misalnya menganalisis kecepatan angin untuk mendeteksi peristiwa badai.
sumber