Monday 17 July 2017

Pindah Rata Filter Scipy


Hmmm, nampaknya quoteasy ini untuk mengimplementasikan fungsi kuantum sebenarnya cukup mudah untuk salah dan telah memupuk diskusi yang baik mengenai efisiensi memori. Saya senang memiliki perut kembung jika itu berarti mengetahui bahwa ada sesuatu yang benar. Ndash Richard Sep 20 14 pada 19:23 NumPys kekurangan fungsi spesifik domain tertentu mungkin karena disiplin Tim Inti dan kesetiaan pada perintah utama NumPys: berikan tipe array N-dimensi. Serta fungsi untuk membuat, dan mengindeks array tersebut. Seperti banyak tujuan mendasar, yang satu ini tidak kecil, dan NumPy melakukannya dengan sangat cemerlang. SciPy yang lebih besar berisi kumpulan perpustakaan khusus domain yang jauh lebih besar (disebut subpackages oleh SciPy devs) - misalnya, optimasi numerik (optimalisasi), pemrosesan sinyal (sinyal), dan kalkulus integral (integrasikan). Dugaan saya adalah bahwa fungsi yang Anda cari ada di setidaknya satu dari paket kecil SciPy (scipy. signal mungkin), bagaimanapun, saya akan melihat lebih dulu koleksi SciPy scikits. Mengidentifikasi scikit yang relevan dan mencari fungsi yang menarik di sana. Scikits adalah paket yang dikembangkan secara independen berdasarkan NumPySciPy dan diarahkan ke disiplin teknis tertentu (misalnya scikits-image. Scikits-learn. Dll) Beberapa di antaranya adalah (khususnya, OpenOpt yang mengagumkan untuk pengoptimalan numerik) sangat dihargai, proyek dewasa panjang Sebelum memilih berada di bawah rubrik scikits yang relatif baru. Situs Scikits menyukai daftar di atas sekitar 30 jenis scikits tersebut. Meskipun setidaknya beberapa di antaranya tidak lagi dalam perkembangan aktif. Setelah saran ini akan membawa Anda ke scikits-timeseries, paket itu tidak lagi dalam pengembangan aktif. Akibatnya, Pandas telah menjadi, AFAIK, perpustakaan seri waktu de facto NumPy. Pandas memiliki beberapa fungsi yang bisa digunakan untuk menghitung moving average yang paling sederhana ini mungkin rollingmean. Yang Anda gunakan seperti: Sekarang, panggil saja fungsi rollingmean yang lewat pada objek Series dan ukuran jendela. Yang dalam contoh saya di bawah ini adalah 10 hari. Verifikasi bahwa itu bekerja - mis. Membandingkan nilai 10 - 15 dalam seri aslinya versus Seri baru yang dihaluskan dengan rolling mean Fungsi rollingmean, bersama dengan sekitar selusin fungsi lainnya dikelompokkan secara informal dalam dokumentasi Pandas di bawah fungsi jendela rubrik yang bergerak pada kedua, fungsi kelompok terkait Di Pandas disebut sebagai fungsi tertimbang secara eksponensial (misalnya ewma yang menghitung rata-rata tertimbang bergerak secara eksponensial). Fakta bahwa kelompok kedua ini tidak termasuk dalam fungsi jendela bergerak yang pertama adalah mungkin karena transformasi berbobot secara eksponensial tidak bergantung pada jendela fixed-length. Saya tahu ini adalah pertanyaan lama, tapi inilah solusi yang tidak menggunakan ekstra. Struktur data atau perpustakaan. Ini adalah linier dalam jumlah elemen dari daftar input dan saya tidak dapat memikirkan cara lain untuk membuatnya lebih efisien (sebenarnya jika ada yang tahu cara yang lebih baik untuk mengalokasikan hasilnya, tolong beritahu saya). CATATAN: ini akan jauh lebih cepat menggunakan array numpy, bukan daftar, tapi saya ingin menghilangkan semua dependensi. Ini juga memungkinkan untuk meningkatkan kinerja dengan eksekusi multi-threaded Fungsi mengasumsikan bahwa daftar masukan satu dimensi, jadi hati-hati. UPD: solusi yang lebih efisien telah diusulkan oleh Alleo dan jasaarim. Anda dapat menggunakan np. convolve untuk itu: Argumen mode menentukan bagaimana menangani tepinya. Saya memilih mode yang valid di sini karena menurut saya itulah cara kebanyakan orang mengharapkan berjalan dengan baik, tapi Anda mungkin memiliki prioritas lain. Berikut adalah plot yang menggambarkan perbedaan antara mode: dijawab 24 Mar 14 at 22:01 Saya suka solusi ini karena bersih (satu baris) dan relatif efisien (pekerjaan dilakukan di dalam numpy). Tapi solusi kuotasi cukup dengan numpy. cumsum memiliki kompleksitas yang lebih baik. Ndash Ulrich Stern 25 Sep 15 15 di 0:31 Anda dapat menghitung mean berjalan dengan: Untungnya, numpy mencakup fungsi konvolve yang dapat kita gunakan untuk mempercepatnya. Mean yang berjalan sama dengan convolving x dengan vektor N yang panjang, dengan semua anggota sama dengan 1N. Implementasi numpy dari konvolve mencakup starting transient, jadi Anda harus menghapus titik N-1 pertama: Pada mesin saya, versi cepat 20-30 kali lebih cepat, tergantung pada panjang vektor input dan ukuran jendela rata-rata. . Perhatikan bahwa konvolve tidak termasuk mode yang sama yang sepertinya harus mengatasi masalah transien awal, namun membaginya antara awal dan akhir. Ini menghilangkan sementara dari akhir, dan awalnya tidak memilikinya. Well, saya kira itu masalah prioritas, saya tidak memerlukan jumlah hasil yang sama dengan mengorbankan kemiringan menuju nol yang ada di data. BTW, inilah perintah untuk menunjukkan perbedaan antara mode: mode (39full39, 39same39, 39valid39) plot (membelit (yang ((200,)), yang ((50,)) 4750, modem)) untuk m dalam mode Sumbu (-10, 251, -.1, 1.1) legenda (mode, pusat penopang39) (dengan pirang dan numpy yang diimpor). Ndash lapis Mar 24 14 at 13:56 panda lebih cocok untuk ini daripada NumPy atau SciPy. Fungsi rollingmean melakukan pekerjaan dengan nyaman. Ini juga mengembalikan array NumPy saat input adalah array. Sulit untuk mengalahkan rollingmean dalam performa dengan implementasi Python custom custom. Berikut adalah contoh kinerja terhadap dua solusi yang diajukan: Ada juga pilihan bagus mengenai bagaimana menangani nilai tepi. Aku selalu kesal dengan fungsi pemrosesan sinyal yang mengembalikan sinyal keluaran dengan bentuk yang berbeda daripada sinyal input saat kedua input dan output memiliki sifat yang sama (misalnya sinyal temporal). Ini memecah korespondensi dengan variabel independen terkait (misalnya waktu, frekuensi) membuat perencanaan atau perbandingan bukan masalah langsung. Lagi pula, jika Anda berbagi perasaan, Anda mungkin ingin mengubah baris terakhir dari fungsi yang diusulkan sebagai ynp. convolve (ww. sum (), s, mode39same39) kembali ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 pada 19:56 Sedikit terlambat ke pesta, tapi saya telah membuat fungsi kecil saya sendiri yang TIDAK membungkus ujung atau bantalan dengan angka nol yang kemudian digunakan untuk menemukan rata-rata juga. Sebagai perawatan lebih lanjut adalah, bahwa ia juga kembali sampel sinyal pada titik spasial spasi. Sesuaikan kode sesuka hati untuk mendapatkan fitur lainnya. Metode ini adalah perkalian matriks sederhana dengan kernel Gaussian yang dinormalisasi. Penggunaan sederhana pada sinyal sinusoidal dengan menambahkan noise terdistribusi normal: Pertanyaan ini sekarang bahkan lebih tua dari pada saat NeXuS menulis tentang hal itu bulan lalu, tapi saya suka bagaimana kode-kodenya menangani kasus-kasus tepi. Namun, karena ini adalah rata-rata bergerak sederhana, hasilnya tertinggal dari data yang mereka gunakan. Saya berpikir bahwa berurusan dengan kasus tepi dengan cara yang lebih memuaskan daripada mode NumPys yang valid. sama. Dan penuh dapat dicapai dengan menerapkan pendekatan yang serupa dengan metode berbasis konvolusi (). Kontribusi saya menggunakan rata-rata berjalan pusat untuk menyesuaikan hasilnya dengan datanya. Bila ada dua titik yang tersedia untuk jendela ukuran penuh yang akan digunakan, rata-rata berjalan dihitung dari jendela yang lebih kecil berturut-turut di tepi array. Sebenarnya, dari jendela yang berurutan lebih besar, tapi itu detail implementasi. Its relatif lambat karena menggunakan convolve (). Dan mungkin bisa dirapikan cukup banyak oleh Pythonista sejati, namun, saya percaya bahwa gagasan itu berdiri. Dijawab Jan 2 at 0:28 np. convolve bagus tapi lambat saat lebar jendela tumbuh besar. Beberapa jawaban memberikan algoritme yang lebih efisien dengan np. cumsum namun tampaknya tidak mampu menangani nilai tepi. Saya sendiri telah menerapkan algoritma yang bisa menangani masalah ini dengan baik, jika masalah ini dideklarasikan sebagai: Parameter masukan mergenum dapat dianggap sebagai 2 windowwidth 1. Saya tahu kode ini sedikit terbaca jika Anda merasa berguna dan menginginkan beberapa expanations, tolong beritahu saya dan Ill memperbarui jawaban ini. (Karena menulis sebuah penjelasan mungkin menghabiskan banyak waktu, saya harap saya melakukannya hanya jika seseorang membutuhkannya. Mohon maafkan saya untuk kemalasan saya :)) Kalau saja Anda tertarik dengan versi aslinya: Ini bahkan lebih tidak terbaca: solusi pertama Mendapatkan menyingkirkan masalah tepi dengan padding nol di sekitar array, tapi solusi kedua diposting di sini menangani dengan cara yang sulit dan langsung :) lapis ya, tapi katakanlah Anda menggunakan metode cumsum pada tick pertama dan menyimpan array rata-rata rolling Anda untuk Kutu berikutnya Setiap centang setelah itu Anda hanya perlu menambahkan nilai rata-rata bergerak terbaru ke array bergulir Anda di tempat penyimpanan. Dengan menggunakan metode ini, Anda tidak menghitung ulang hal-hal yang telah Anda perhitungkan: Pada tick pertama Anda menyimpulkan setelah Anda menambahkan kuota elemen terakhir yang lebih cepat 2x lebih cepat untuk semua kutu berikutnya. Ndash litepresence 10 Jun 16 at 12:29 Jika Anda memilih untuk menggulung sendiri, daripada menggunakan perpustakaan yang ada, mohon disadari kesalahan floating point dan cobalah untuk meminimalkan pengaruhnya: Jika semua nilai Anda kira-kira sama dengan besarnya , Maka ini akan membantu melestarikan presisi dengan selalu menambahkan nilai dengan besaran yang kira-kira sama. Dalam kalimat terakhir saya, saya mencoba untuk menunjukkan mengapa hal itu membantu kesalahan floating point. Jika dua nilai kira-kira memiliki urutan besaran yang sama, maka menambahkannya kurang presisi daripada jika Anda menambahkan jumlah yang sangat besar ke angka yang sangat kecil. Kode ini menggabungkan nilai kuadjacentquot dengan cara yang bahkan jumlah antara harus selalu cukup dekat besarnya, untuk meminimalkan kesalahan floating point. Tidak ada bukti bodoh tapi metode ini telah menyelamatkan beberapa proyek yang sangat buruk dalam produksi. Ndash Mayur Patel 15 Desember pukul 17:22 Alleo: Alih-alih melakukan satu penambahan per nilai, Anda akan melakukan dua hal. Buktinya sama dengan masalah bit flipping. Namun, intinya jawaban ini belum tentu kinerjanya, tapi presisi. Penggunaan memori untuk rata-rata nilai 64-bit tidak akan melebihi 64 elemen dalam cache, jadi juga ramah dalam penggunaan memori. Ndash Mayur Patel Dec 29 14 at 17: 04Contoh berikut menghasilkan rata-rata bergerak dari nilai WINDOW sebelumnya. Kami memotong nilai pertama (WINDOW -1) karena kita tidak bisa menemukan rata-rata di depan mereka. (Perilaku default untuk konvolusi adalah mengasumsikan bahwa nilai sebelum permulaan urutan kita adalah 0). (Secara lebih formal, kita membuat urutan y untuk urutan x dimana yi (xi x (i1) 8230. x (in)) n) Ini menggunakan fungsi konvolusi numpy8217s. Ini adalah operasi rata-rata bergerak rata-rata. Mengubah bobot membuat beberapa nilai lebih penting mengimbangi dengan tepat memungkinkan Anda melihat rata-rata sekitar titik daripada titik sebelumnya. Daripada memangkas nilai, kita bisa memperbaiki nilai awal di tempat, seperti yang digambarkan dalam contoh ini:

No comments:

Post a Comment