Pembaruan: Algoritma berkinerja terbaik sejauh ini adalah yang ini .
Pertanyaan ini mengeksplorasi algoritma yang kuat untuk mendeteksi puncak tiba-tiba dalam data time-time real-time.
Pertimbangkan dataset berikut:
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 tetapi ini bukan tentang bahasa tetapi tentang algoritma)
Anda dapat dengan jelas melihat bahwa ada tiga puncak besar dan beberapa puncak kecil. Dataset ini adalah contoh spesifik dari kumpulan dataset deret waktu yang menjadi pertanyaan. Kelas kumpulan data ini memiliki dua fitur umum:
- Ada suara dasar dengan rata-rata umum
- Ada ' puncak ' besar atau ' titik data lebih tinggi ' yang secara signifikan menyimpang dari kebisingan.
Mari kita asumsikan juga sebagai berikut:
- lebar puncak tidak dapat ditentukan sebelumnya
- ketinggian puncak jelas dan signifikan menyimpang dari nilai-nilai lainnya
- algoritma yang digunakan harus menghitung waktu nyata (jadi ubah dengan setiap titik data baru)
Untuk situasi seperti itu, nilai batas perlu dibangun yang memicu sinyal. Namun, nilai batas tidak boleh statis dan harus ditentukan realtime berdasarkan suatu algoritma.
Pertanyaan Saya: apakah algoritma yang baik untuk menghitung ambang seperti itu secara realtime? Apakah ada algoritma khusus untuk situasi seperti itu? Algoritme apa yang paling terkenal?
Algoritma yang kuat atau wawasan yang bermanfaat semuanya sangat dihargai. (dapat menjawab dalam bahasa apa pun: ini tentang algoritme)
Jawaban:
Algoritma pendeteksian puncak yang kuat (menggunakan skor-z)
Saya datang dengan algoritma yang bekerja sangat baik untuk tipe dataset ini. Ini didasarkan pada prinsip dispersi : jika datapoint baru adalah x jumlah standar deviasi yang diberikan jauh dari rata-rata bergerak, sinyal algoritma (juga disebut skor-z ). Algoritma ini sangat kuat karena membangun sebuah terpisah berarti bergerak dan deviasi, sehingga sinyal tidak korup ambang batas. Oleh karena itu sinyal masa depan diidentifikasi dengan akurasi yang kira-kira sama, terlepas dari jumlah sinyal sebelumnya. Algoritma ini mengambil 3 input:
lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
daninfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation
. Misalnya, alag
dari 5 akan menggunakan 5 pengamatan terakhir untuk memuluskan data. SEBUAHthreshold
3,5 akan memberi sinyal jika datapoint berjarak 3,5 deviasi standar dari moving average. Daninfluence
dari 0,5 memberikan sinyal setengah dari pengaruh yang dimiliki titik data normal. Demikian juga, suatuinfluence
0 mengabaikan sinyal sepenuhnya untuk menghitung ulang ambang baru. Karena itu pengaruh 0 adalah opsi yang paling kuat (tetapi mengasumsikan stasioneritas ); menempatkan opsi pengaruh pada 1 paling tidak kuat. Untuk data yang tidak stasioner, karena itu opsi pengaruh harus diletakkan di suatu tempat antara 0 dan 1.Ia bekerja sebagai berikut:
Kodesemu
Aturan praktis untuk memilih parameter yang baik untuk data Anda dapat ditemukan di bawah.
Demo
Kode Matlab untuk demo ini dapat ditemukan di sini . Untuk menggunakan demo, jalankan saja dan buat sendiri seri waktu dengan mengklik pada grafik atas. Algoritme mulai bekerja setelah menggambar
lag
sejumlah pengamatan.Hasil
Untuk pertanyaan awal, algoritme ini akan memberikan output berikut saat menggunakan pengaturan berikut
lag = 30, threshold = 5, influence = 0
::Implementasi dalam berbagai bahasa pemrograman:
Matlab (saya)
R (saya)
Golang (Xeoncross)
Python (R Kiselev)
Python [versi efisien] (delica)
Swift (saya)
Groovy (JoshuaCWebDeveloper)
C ++ (brad)
C ++ (Animesh Pandey)
Karat (penyihir)
Scala (Mike Roberts)
Kotlin (leoderprofi)
Ruby (Kimmo Lehto)
Fortran [untuk deteksi resonansi] (THo)
Julia (Matt Camp)
C # (Ocean Airdrop)
C (DavidC)
Jawa (takanuva15)
JavaScript (Dirk Lüsebrink)
TypeScript (Jerry Gamble)
Perl (Alen)
PHP (radhoo)
Aturan praktis untuk mengkonfigurasi algoritma
lag
: parameter lag menentukan berapa banyak data Anda akan dihaluskan dan seberapa adaptif algoritma terhadap perubahan rata-rata jangka panjang data. Semakin stasioner data Anda, semakin banyak keterlambatan yang harus Anda sertakan (ini akan meningkatkan kekokohan algoritma). Jika data Anda berisi tren yang bervariasi waktu, Anda harus mempertimbangkan seberapa cepat Anda ingin algoritma beradaptasi dengan tren ini. Yaitu, jika Anda memasukkanlag
10, dibutuhkan 10 'periode' sebelum treshold algoritma disesuaikan dengan perubahan sistematis dalam rata-rata jangka panjang. Jadi pilihlag
parameter berdasarkan perilaku tren data Anda dan seberapa adaptif algoritma yang Anda inginkan.influence
: parameter ini menentukan pengaruh sinyal pada ambang pendeteksian algoritma. Jika diletakkan pada 0, sinyal tidak memiliki pengaruh pada ambang, sehingga sinyal di masa depan terdeteksi berdasarkan ambang yang dihitung dengan mean dan standar deviasi yang tidak dipengaruhi oleh sinyal masa lalu. Cara lain untuk memikirkan hal ini adalah bahwa jika Anda meletakkan pengaruhnya pada 0, Anda secara implisit mengasumsikan stasioneritas (yaitu tidak peduli berapa banyak sinyal yang ada, deret waktu selalu kembali ke rata-rata yang sama dalam jangka panjang). Jika ini bukan masalahnya, Anda harus meletakkan parameter pengaruh di suatu tempat antara 0 dan 1, tergantung pada sejauh mana sinyal secara sistematis dapat mempengaruhi tren data yang bervariasi waktu. Misalnya, jika sinyal mengarah ke jeda struktural dari rata-rata jangka panjang dari deret waktu, parameter pengaruh harus diletakkan tinggi (mendekati 1) sehingga ambang batas dapat menyesuaikan dengan perubahan ini dengan cepat.threshold
: parameter threshold adalah jumlah standar deviasi dari moving average di atas yang mana algoritma akan mengklasifikasikan titik data baru sebagai sinyal. Misalnya, jika datapoint baru adalah 4,0 standar deviasi di atas rata-rata bergerak dan parameter ambang batas ditetapkan sebagai 3,5, algoritma akan mengidentifikasi datapoint sebagai sinyal. Parameter ini harus ditetapkan berdasarkan berapa banyak sinyal yang Anda harapkan. Misalnya, jika data Anda didistribusikan secara normal, ambang (atau: skor-z) 3,5 sesuai dengan probabilitas pensinyalan 0,00047 (dari tabel ini), yang menyiratkan bahwa Anda mengharapkan sinyal sekali setiap 2128 titik data (1 / 0,00047). Ambang karena itu secara langsung mempengaruhi seberapa sensitif algoritma dan dengan demikian juga seberapa sering sinyal algoritma. Periksa data Anda sendiri dan tentukan ambang masuk akal yang membuat sinyal algoritme saat Anda menginginkannya (beberapa percobaan-dan-kesalahan mungkin diperlukan di sini untuk mencapai ambang yang baik untuk tujuan Anda).PERINGATAN: Kode di atas selalu berulang pada semua titik data setiap kali dijalankan. Saat menerapkan kode ini, pastikan untuk membagi perhitungan sinyal menjadi fungsi terpisah (tanpa loop). Kemudian ketika datapoint baru tiba, perbarui
filteredY
,avgFilter
danstdFilter
sekali. Jangan menghitung ulang sinyal untuk semua data setiap kali ada datapoint baru (seperti dalam contoh di atas), itu akan sangat tidak efisien dan lambat!Cara lain untuk memodifikasi algoritma (untuk perbaikan potensial) adalah:
influence
parameter terpisah untuk mean dan std ( seperti yang dilakukan dalam terjemahan Swift ini )(Diketahui) kutipan akademik untuk jawaban StackOverflow ini:
Yin, C. (2020). Pengulangan dinukleotida dalam genom coronavirus SARS-CoV-2: implikasi evolusi . ArXiv e-print, dapat diakses dari: https://arxiv.org/pdf/2006.00280.pdf
Esnaola-Gonzalez, I., Gómez-Omella, M., Ferreiro, S., Fernandez, I., Lázaro, I., & García, E. (2020). Platform IoT Menuju Peningkatan Rantai Produksi Unggas . Sensor, 20 (6), 1549.
Gao, S., & Calderon, DP (2020). Rejimen terus menerus dari integrasi kortiko-motor mengkalibrasi tingkat gairah selama kemunculan dari anestesi . bioRxiv.
Cloud, B., Tarien, B., Liu, A., Shedd, T., Lin, X., Hubbard, M., ... & Moore, JK (2019). Fusi sensor berbasis smartphone adaptif untuk memperkirakan metrik kinematik dayung kompetitif . PloS satu, 14 (12).
Ceyssens, F., Carmona, MB, Kil, D., Deprez, M., Tooten, E., Nuttin, B., ... & Puers, R. (2019). Rekaman saraf kronis dengan probe penampang subselular menggunakan 0,06 mm² mikroneedle terlarut sebagai perangkat penyisipan . Sensor dan Aktuator B: Kimia , 284, hlm. 369-376.
Don, E., Laeremans, M., Orjuela, JP, Avila-Palencia, I., de Nazelle, A., Nieuwenhuijsen, M., ... & Nawrot, T. (2019). Transportasi yang paling mungkin menyebabkan paparan puncak polusi udara dalam kehidupan sehari-hari: Bukti dari lebih dari 2000 hari pemantauan pribadi . Lingkungan Atmosfer , 213, 424-432.
Schaible BJ, Snook KR, Yin J., dkk. (2019). Percakapan Twitter dan laporan media berita Inggris tentang poliomielitis di lima negara yang berbeda, Januari 2014 hingga April 2015 . The Permanente Journal , 23, 18-181.
Lima, B. (2019). Eksplorasi Permukaan Objek Menggunakan Ujung Robotic Tactile-Enabled (disertasi Doktor, Université d'Ottawa / University of Ottawa).
Lima, BMR, Ramos, LCS, de Oliveira, TEA, da Fonseca, VP, & Petriu, EM (2019). Heart Rate Detection Menggunakan Multimoda Perabaan Sensor dan Z-skor Berbasis Puncak Detection Algorithm . Prosiding CMBES , 42.
Lima, BMR, de Oliveira, TEA, da Fonseca, VP, Zhu, Q., Goubran, M., Groza, VZ, & Petriu, EM (2019, Juni). Deteksi Detak Jantung Menggunakan Sensor Taktil Multimodal Miniatur . Pada tahun 2019, Simposium Internasional IEEE tentang Pengukuran dan Aplikasi Medis (MeMeA) (hlm. 1-6). IEEE.
Ting, C., Field, R., Quach, T., Bauer, T. (2019). Deteksi Batas Umum dengan Menggunakan Analisis Berbasis Kompresi . ICASSP 2019 - 2019 Konferensi Internasional IEEE tentang Akustik, Pidato dan Pemrosesan Sinyal (ICASSP) , Brighton, Inggris Raya, hlm. 3522-3526.
Carrier, EE (2019). Mengeksploitasi kompresi dalam memecahkan sistem linear diskrit . Disertasi doktoral , Universitas Illinois di Urbana-Champaign.
Khandakar, A., Chowdhury, ME, Ahmed, R., Dhib, A., Mohammed, M., Al-Emadi, NA, & Michelson, D. (2019). Sistem portabel untuk memantau dan mengendalikan perilaku pengemudi dan penggunaan ponsel saat mengemudi . Sensor , 19 (7), 1563.
Baskozos, G., Dawes, JM, Austin, JS, Antunes-Martins, A., McDermott, L., Clark, AJ, ... & Orengo, C. (2019). Analisis komprehensif ekspresi RNA noncoding panjang di ganglion akar dorsal mengungkapkan spesifisitas tipe sel dan disregulasi setelah cedera saraf . Nyeri , 160 (2), 463.
Cloud, B., Tarien, B., Crawford, R., & Moore, J. (2018). Fusi sensor berbasis smartphone adaptif untuk memperkirakan metrik kinematik dayung kompetitif . engrXiv Preprints .
Zajdel, TJ (2018). Antarmuka Elektronik untuk Biosensing Berbasis Bakteri . Disertasi doktoral , UC Berkeley.
Perkins, P., Heber, S. (2018). Identifikasi Ribosom Tempat Pause Menggunakan Z-Score Berbasis Puncak Detection Algorithm . IEEE 8 Konferensi Internasional tentang Kemajuan Komputasi dalam Ilmu Biologi dan Kedokteran (ICCABS) , ISBN: 978-1-5386-8520-4.
Moore, J., Goffin, P., Meyer, M., Lundrigan, P., Patwari, N., Sward, K., & Wiese, J. (2018). Mengelola Lingkungan Dalam Rumah melalui Sensing, Annotating, dan Visualisasi Data Kualitas Udara . Prosiding ACM pada Teknologi Interaktif, Mobile, Wearable dan Ubiquitous , 2 (3), 128.
Lo, O., Buchanan, WJ, Griffiths, P., dan Macfarlane, R. (2018), Metode Pengukuran Jarak untuk Peningkatan Deteksi Ancaman Orang Dalam , Jaringan Keamanan dan Komunikasi , Vol. 2018, ID Artikel 5906368.
Apurupa, NV, Singh, P., Chakravarthy, S., & Buduru, AB (2018). Studi kritis tentang pola konsumsi daya di Apartemen India . Disertasi doktoral , IIIT-Delhi.
Scirea, M. (2017). Generasi Musik Afektif dan pengaruhnya terhadap pengalaman pemain . Disertasi doktoral , IT University of Copenhagen, Desain Digital.
Scirea, M., Eklund, P., Togelius, J., & Risi, S. (2017). Primal-improv: Menuju improvisasi musik co-evolusioner . Ilmu Komputer dan Teknik Elektronik (CEEC) , 2017 (hal. 172-177). IEEE.
Catalbas, MC, Cegovnik, T., Sodnik, J. dan Gulten, A. (2017). Deteksi kelelahan pengemudi berdasarkan pergerakan mata saccadic , Konferensi Internasional ke-10 tentang Teknik Listrik dan Elektronik (ELECO), hlm. 913-917.
Pekerjaan lain menggunakan algoritma
Bernardi, D. (2019). Studi kelayakan tentang memasangkan jam tangan pintar dan perangkat seluler melalui gerakan multi-modal . Tesis master , Universitas Aalto.
Lemmens, E. (2018). Deteksi outlier dalam log peristiwa dengan menggunakan metode statistik , tesis Master , Universitas Eindhoven.
Willems, P. (2017). Mood mengendalikan suasana afektif untuk orang tua , tesis Master , University of Twente.
Ciocirdel, GD dan Varga, M. (2016). Prediksi Pemilu Berdasarkan Tampilan Halaman Wikipedia . Makalah proyek , Vrije Universiteit Amsterdam.
Aplikasi lain dari algoritma ini
Machine Learning Financial Laboratory , paket Python berdasarkan karya De Prado, ML (2018). Kemajuan dalam pembelajaran mesin keuangan . John Wiley & Sons.
Adafruit CircuitPlayground Library , Adafruit board (Adafruit Industries)
Algoritma step tracker , Aplikasi Android (jeeshnair)
Tautan ke algoritma deteksi puncak lainnya
Jika Anda menggunakan fungsi ini di suatu tempat, harap beri saya kredit atau jawaban ini. Jika Anda memiliki pertanyaan mengenai algoritme ini, poskan di komentar di bawah atau hubungi saya di LinkedIn .
sumber
threshold
grafik hanya menjadi garis hijau datar setelah lonjakan besar hingga 20 dalam data, dan tetap seperti itu selama sisa grafik ... Jika Saya menghapus sike, ini tidak terjadi, jadi sepertinya disebabkan oleh lonjakan data. Adakah yang tahu apa yang sedang terjadi? Saya seorang pemula di Matlab, jadi saya tidak bisa mengetahuinya ...Berikut adalah
Python
/numpy
implementasi dari algoritma z-score yang dihaluskan (lihat jawaban di atas ). Anda dapat menemukan intinya di sini .Di bawah ini adalah tes pada dataset yang sama yang menghasilkan plot yang sama seperti pada jawaban asli untuk
R
/Matlab
sumber
y
adalah larik data yang Anda lewati,signals
adalah larik+1
atau-1
keluaran yang menunjukkan untuk setiap titik datay[i]
apakah titik data itu merupakan "puncak signifikan" mengingat pengaturan yang Anda gunakan.Salah satu pendekatan adalah mendeteksi puncak berdasarkan pengamatan berikut:
Ini menghindari positif palsu dengan menunggu sampai tren naik berakhir. Ini bukan "real-time" dalam arti bahwa ia akan kehilangan puncaknya dengan satu dt. sensitivitas dapat dikontrol dengan membutuhkan margin untuk perbandingan. Ada pertukaran antara deteksi bising dan waktu tunda deteksi. Anda dapat memperkaya model dengan menambahkan lebih banyak parameter:
di mana dt dan m adalah parameter untuk mengontrol sensitivitas vs penundaan waktu
Inilah yang Anda dapatkan dengan algoritma yang disebutkan:
di sini adalah kode untuk mereproduksi plot dengan python:
Dengan mengatur
m = 0.5
, Anda bisa mendapatkan sinyal yang lebih bersih dengan hanya satu false positive:sumber
Dalam pemrosesan sinyal, deteksi puncak sering dilakukan melalui transformasi wavelet. Anda pada dasarnya melakukan transformasi wavelet diskrit pada data deret waktu Anda. Persimpangan nol dalam koefisien detail yang dikembalikan akan sesuai dengan puncak dalam sinyal deret waktu. Anda mendapatkan amplitudo puncak yang berbeda terdeteksi pada level koefisien detail yang berbeda, yang memberi Anda resolusi multi-level.
sumber
Kami telah berusaha menggunakan algoritma skor-z yang dihaluskan pada set data kami, yang menghasilkan sensitivitas yang berlebihan atau kurang sensitivitas (tergantung pada bagaimana parameter disetel), dengan sedikit jalan tengah. Dalam sinyal lalu lintas situs kami, kami telah mengamati baseline frekuensi rendah yang mewakili siklus harian dan bahkan dengan parameter terbaik yang mungkin (ditampilkan di bawah), itu masih tertinggal terutama pada hari ke-4 karena sebagian besar titik data diakui sebagai anomali .
Membangun di atas algoritma z-score asli, kami menemukan cara untuk menyelesaikan masalah ini dengan pemfilteran terbalik. Detail algoritma yang dimodifikasi dan aplikasinya pada atribusi trafik komersial TV diposting di blog tim kami .
sumber
Dalam topologi komputasi, gagasan homologi persisten mengarah pada solusi yang efisien - secepat pengurutan angka -. Itu tidak hanya mendeteksi puncak, itu mengukur "signifikansi" puncak secara alami yang memungkinkan Anda untuk memilih puncak yang penting bagi Anda.
Ringkasan algoritma. Dalam pengaturan 1 dimensi (seri waktu, sinyal bernilai nyata), algoritme dapat dengan mudah dijelaskan oleh gambar berikut:
Pikirkan grafik fungsi (atau sub-level set) sebagai lanskap dan pertimbangkan penurunan ketinggian air mulai dari level infinity (atau 1,8 pada gambar ini). Sementara tingkat menurun, di pulau-pulau maxima lokal muncul. Di minimum lokal pulau-pulau ini bergabung bersama. Satu detail dalam ide ini adalah bahwa pulau yang muncul kemudian digabung menjadi pulau yang lebih tua. "Kegigihan" suatu pulau adalah waktu kelahirannya dikurangi waktu kematiannya. Panjang batang biru menggambarkan kegigihan, yang merupakan "signifikansi" puncak yang disebutkan di atas.
Efisiensi. Tidak terlalu sulit untuk menemukan implementasi yang berjalan dalam waktu linier - sebenarnya itu adalah loop tunggal yang sederhana - setelah nilai fungsi diurutkan. Jadi implementasi ini harus cepat dalam praktiknya dan juga mudah diimplementasikan.
Referensi. Tulisan seluruh cerita dan referensi untuk motivasi dari homologi persisten (bidang dalam topologi aljabar komputasi) dapat ditemukan di sini: https://www.sthu.org/blog/13-perstopology-peakdetection/index.html
sumber
Menemukan algoritma lain oleh GH Palshikar di Algoritma Sederhana untuk Deteksi Puncak dalam Time-Series .
Algoritmanya seperti ini:
Keuntungan
Kekurangan
k
danh
terlebih dahuluContoh:
sumber
Berikut ini adalah implementasi dari algoritma Smoothed z-score (di atas) di Golang. Ini mengasumsikan sepotong
[]int16
(sampel PCM 16bit). Anda dapat menemukan intinya di sini .sumber
Berikut ini adalah implementasi C ++ dari algoritma z-score yang dihaluskan dari jawaban ini
sumber
Masalah ini terlihat mirip dengan yang saya temui dalam kursus sistem hybrid / embedded, tapi itu terkait dengan mendeteksi kesalahan ketika input dari sensor berisik. Kami menggunakan filter Kalman untuk memperkirakan / memprediksi keadaan tersembunyi dari sistem, kemudian menggunakan analisis statistik untuk menentukan kemungkinan bahwa suatu kesalahan telah terjadi . Kami bekerja dengan sistem linier, tetapi ada varian nonlinear. Saya ingat pendekatan itu secara mengejutkan adaptif, tetapi itu membutuhkan model dinamika sistem.
sumber
Implementasi C ++
sumber
Sebagai lanjutan dari solusi yang diusulkan oleh Jean-Paul, saya telah mengimplementasikan algoritmanya dalam C #
Contoh penggunaan:
sumber
Berikut adalah implementasi C dari skor Z Jean-Paul's Smoothed untuk mikrokontroler Arduino yang digunakan untuk mengambil pembacaan accelerometer dan memutuskan apakah arah dampak telah datang dari kiri atau kanan. Ini berkinerja sangat baik karena perangkat ini mengembalikan sinyal yang dipantulkan. Berikut ini input untuk algoritme deteksi puncak ini dari perangkat - menunjukkan dampak dari kanan diikuti oleh dan dampak dari kiri. Anda dapat melihat lonjakan awal kemudian osilasi sensor.
Miliknya hasilnya dengan pengaruh = 0
Tidak hebat tapi di sini dengan pengaruh = 1
itu sangat bagus.
sumber
Berikut ini adalah implementasi Java aktual berdasarkan jawaban Groovy yang diposting sebelumnya. (Saya tahu sudah ada implementasi Groovy dan Kotlin yang diposting, tetapi untuk orang seperti saya yang hanya melakukan Java, sungguh merepotkan untuk mengetahui bagaimana mengkonversi antara bahasa lain dan Jawa).
(Hasil cocok dengan grafik orang lain)
Implementasi algoritma
Metode utama
Hasil
sumber
Lampiran 1 untuk jawaban asli:
Matlab
danR
terjemahanKode matlab
Contoh:
Kode r
Contoh:
Kode ini (kedua bahasa) akan menghasilkan hasil berikut untuk data dari pertanyaan awal:
Lampiran 2 untuk jawaban asli:
Matlab
kode demonstrasi(klik untuk membuat data)
sumber
Berikut ini adalah upaya saya untuk membuat solusi Ruby untuk "Algo z-score dihaluskan" dari jawaban yang diterima:
Dan contoh penggunaan:
sumber
Versi berulang dalam python / numpy untuk jawaban https://stackoverflow.com/a/22640362/6029703 ada di sini. Kode ini lebih cepat dari rata-rata komputasi dan standar deviasi setiap jeda untuk data besar (100000+).
sumber
Saya pikir saya akan memberikan implementasi algoritma Julia saya untuk orang lain. Intinya dapat ditemukan di sini
sumber
Berikut ini adalah implementasi Groovy (Java) dari algoritma z-score yang dihaluskan ( lihat jawaban di atas ).
Di bawah ini adalah tes pada dataset yang sama yang menghasilkan hasil yang sama seperti implementasi Python / numpy di atas .
sumber
Berikut ini adalah versi Scala (non-idiomatis) dari algoritma z-score yang dihaluskan :
Berikut ini adalah tes yang mengembalikan hasil yang sama dengan versi Python dan Groovy:
Intinya di sini
sumber
Saya membutuhkan sesuatu seperti ini di proyek android saya. Kupikir aku akan mengembalikan implementasi Kotlin .
proyek sampel dengan grafik verifikasi dapat ditemukan di github .
sumber
Berikut adalah versi Fortran yang diubah dari algoritma z-score . Itu diubah khusus untuk deteksi puncak (resonansi) dalam fungsi transfer dalam ruang frekuensi (Setiap perubahan memiliki komentar kecil dalam kode).
Modifikasi pertama memberikan peringatan kepada pengguna jika ada resonansi di dekat batas bawah dari vektor input, ditunjukkan oleh standar deviasi yang lebih tinggi dari ambang tertentu (10% dalam kasus ini). Ini berarti bahwa sinyal tidak cukup datar untuk deteksi menginisialisasi filter dengan benar.
Modifikasi kedua adalah bahwa hanya nilai puncak tertinggi yang ditambahkan ke puncak yang ditemukan. Ini dicapai dengan membandingkan setiap nilai puncak yang ditemukan dengan besarnya (lag) pendahulunya dan (lag) penggantinya.
Perubahan ketiga adalah untuk menghormati bahwa puncak resonansi biasanya menunjukkan beberapa bentuk simetri di sekitar frekuensi resonansi. Jadi wajar untuk menghitung rata-rata dan std secara simetris di sekitar titik data saat ini (bukan hanya untuk pendahulunya). Ini menghasilkan perilaku deteksi puncak yang lebih baik.
Modifikasi memiliki efek bahwa seluruh sinyal harus diketahui fungsi sebelumnya yang merupakan kasus biasa untuk deteksi resonansi (sesuatu seperti Contoh Matlab dari Jean-Paul di mana titik data yang dihasilkan dengan cepat tidak akan berfungsi).
Untuk aplikasi saya, algoritma ini bekerja seperti pesona!
sumber
Jika Anda sudah mendapatkan data dalam tabel database, berikut ini adalah versi SQL dari algoritma z-score sederhana:
sumber
Versi python yang bekerja dengan aliran waktu nyata (tidak menghitung ulang semua titik data pada saat kedatangan setiap titik data baru). Anda mungkin ingin mengubah apa fungsi kelas kembali - untuk tujuan saya, saya hanya perlu sinyal.
sumber
Saya membiarkan diri saya membuat versi javascript. Akan sangat membantu. Javascript harus berupa transkripsi langsung dari Pseudocode yang diberikan di atas. Tersedia sebagai paket npm dan repo github:
Terjemahan Javascript:
sumber
Jika nilai batas atau kriteria lain bergantung pada nilai masa depan, maka satu-satunya solusi (tanpa mesin waktu, atau pengetahuan lain tentang nilai masa depan) adalah menunda keputusan apa pun sampai seseorang memiliki nilai masa depan yang memadai. Jika Anda ingin level di atas rata-rata yang mencakup, misalnya, 20 poin, maka Anda harus menunggu hingga Anda memiliki setidaknya 19 poin di depan setiap keputusan puncak, atau titik baru berikutnya dapat benar-benar membuang ambang Anda 19 poin yang lalu .
Plot Anda saat ini tidak memiliki puncak ... kecuali Anda entah bagaimana tahu sebelumnya bahwa poin berikutnya bukan 1e99, yang setelah mengubah dimensi Y plot Anda, akan datar sampai titik itu.
sumber
.. As large as in the picture
Aku berarti: untuk situasi yang sama di mana ada puncak yang signifikan dan kebisingan dasar.Dan inilah implementasi PHP dari algo ZSCORE:
sumber
($len - 1)
bukannya$len
dalamstddev()
Alih-alih membandingkan maxima dengan rata-rata, seseorang juga dapat membandingkan maxima dengan minima yang berdekatan di mana minima hanya didefinisikan di atas ambang batas noise. Jika maksimum lokal> 3 kali (atau faktor kepercayaan lainnya) baik minimum minimum, maka maksimum itu adalah puncak. Penentuan puncak lebih akurat dengan jendela bergerak yang lebih luas. Omong-omong di atas menggunakan perhitungan yang berpusat di tengah jendela, daripada perhitungan di akhir jendela (== lag).
Perhatikan bahwa maxima harus dilihat sebagai peningkatan sinyal sebelum dan penurunan setelah.
sumber
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:
sumber
Versi berorientasi objek dari algoritma z-score menggunakan mordern C +++
sumber
filtered_signal
,signal
,avg_filtered
danstd_filtered
variabel sebagai pribadi dan hanya akan memperbarui array sekali ketika datapoint baru tiba (sekarang loop kode atas semua datapoints setiap kali itu disebut). Itu akan meningkatkan kinerja kode Anda dan lebih cocok dengan struktur OOP.