Sunday 13 August 2017

Moving average standard deviation matlab


Saya memiliki serangkaian data x, y dan saya mencoba untuk menemukan rata-rata bergerak. Nomor data x adalah bilangan bulat dari 1 sampai 100 sedangkan data y adalah bilangan dari 0,01 sampai 1 dan mereka juga memiliki deviasi standar ydev (yang kita dapatkan karena eksperimen berulang beberapa kali). Saya mencoba untuk menemukan rata-rata bergerak menggunakan 20 tetangga terdekat (menggunakan Matlab): Cara di atas menghasilkan rata-rata bergerak tapi saya tidak tahu bagaimana menggunakan deviasi standar yang saya miliki untuk setiap titik data karena beberapa titik data memiliki banyak Penyimpangan standar yang lebih besar daripada yang lain yang berarti mereka tidak dapat diandalkan seperti orang lain (jadi mungkin beratnya kurang). Bagaimana saya bisa memasukkan standar deviasi untuk setiap titik data dalam perhitungan di atas yang diminta 5 Jul 15 15:07 Bergerak rata-rata atau bergerak median. Mengenai pertanyaan quotHow dapatkah saya memasukkan standar deviasi untuk setiap titik data di atas perhitunganquot, itu tergantung pada apa yang ingin Anda lakukan. Anda harus terlebih dahulu memutuskan itu (yang bukan pertanyaan pemrograman). Saran: Anda bisa menggunakan keseluruhan rangkaian data untuk setiap x (bukan hanya rata-rata dan standar deviasi) dan hitung meanmedian dari ndash Luis Mendo 5 15 15 15:12 LuisMendo Saya ingin melakukan moving average (saya mengeditnya Kode untuk mencerminkan itu). Kumpulan data adalah eksperimen deret waktu dan telah berulang beberapa kali (yaitu bagaimana saya memiliki deviasi standar untuk setiap titik). Saya ingin menggunakan standar deviasi untuk setiap titik dalam perhitungan moving average karena saya menginginkan poin dengan standar deviasi lebih kecil untuk menimbang lebih banyak daripada titik dengan standar deviasi yang lebih besar. Ndash AL B 5 Jul 15 at 16:50 Katakanlah Anda memiliki sebuah vektor a. Kemudian cara lain menulis berarti (a) sebagai rata-rata tertimbang adalah awts. Dimana wts ones (1, numel (a)) numel (a). Dalam kasus Anda, Anda memiliki y (ind1 (i): ind2 (i)). Kedengarannya seperti apa yang ingin Anda gunakan adalah rata-rata bergerak tertimbang, di mana bobot Anda tidak lagi identik, namun dipilih dengan menggunakan standar deviasi dari nilai yang sesuai. Dengan asumsi vektor sd memegang standar deviasi, Heres salah satu cara untuk melakukan ini: Di ​​sini, nilai dengan standar deviasi yang lebih kecil akan memberikan bobot yang lebih besar. Ide alternatif adalah menghitung rata-rata pergerakan sederhana dari kedua y dan deviasi standar Anda. Dan kemudian plot mereka bersama satu sama lain. Ini memiliki keuntungan karena lebih dapat ditafsirkan secara statistik daripada memilih bobot sebagai fungsi dari penyimpangan standar. Di bawah ini Anda dapat melihat metode C saya untuk menghitung Bollinger Bands untuk setiap titik (moving average, up band, down band). Seperti yang Anda lihat, metode ini menggunakan 2 untuk loop untuk menghitung deviasi standar bergerak dengan menggunakan rata-rata bergerak. Dulu mengandung loop tambahan untuk menghitung rata-rata bergerak selama periode n terakhir. Yang ini bisa saya hapus dengan menambahkan nilai titik baru ke totalaverage pada awal loop dan menghapus nilai titik i - n pada akhir loop. Pertanyaan saya sekarang adalah pada dasarnya: Dapatkah saya menghapus loop batin yang tersisa dengan cara yang sama seperti yang saya lakukan dengan rata-rata bergerak bertanya pada 31 Januari 13 di 21:45 Jawabannya adalah ya, Anda bisa. Pada pertengahan tahun 80an, saya mengembangkan algoritma semacam itu (mungkin tidak asli) di FORTRAN untuk aplikasi pemantauan dan kontrol proses. Sayangnya, itu lebih dari 25 tahun yang lalu dan saya tidak ingat rumus yang tepat, namun teknik ini merupakan perpanjangan dari satu untuk moving averages, dengan perhitungan orde kedua, bukan hanya linier. Setelah melihat kode Anda beberapa, saya berpikir bahwa saya dapat menjelaskan bagaimana saya melakukannya saat itu. Perhatikan bagaimana lingkaran batin Anda menghasilkan Sum of Squares: dengan cara yang sama seperti rata-rata Anda pada awalnya memiliki Nilai Nilai Satu-satunya dua perbedaan adalah urutannya (kekuatannya 2 bukan 1) dan bahwa Anda mengurangi rata-rata Setiap nilai sebelum Anda persegi itu. Nah, itu mungkin terlihat tidak terpisahkan, tapi sebenarnya bisa dipisahkan: Sekarang istilah pertama hanyalah Sum of Squares, Anda menangani hal itu dengan cara yang sama seperti Anda menghitung jumlah Nilai rata-rata. Istilah terakhir (k2n) hanya rata-rata kuadrat periode. Karena Anda membagi hasil pada periode itu pula, Anda bisa menambahkan kuadrat rata-rata baru tanpa tambahan lingkaran. Akhirnya, dalam istilah kedua (SUM (-2vi) k), karena SUM (vi) total kn maka Anda bisa mengubahnya menjadi ini: atau hanya -2k2n. Yaitu -2 kali rata-rata kuadrat, sekali periode (n) terbagi lagi. Jadi rumus gabungan terakhir adalah: (pastikan untuk memeriksa keabsahan ini, karena saya menurunkannya dari atas kepalaku) Dan memasukkan ke dalam kode Anda seharusnya terlihat seperti ini: Masalah dengan pendekatan yang menghitung jumlah kuadrat Apakah itu dan kuadrat jumlah bisa sangat besar, dan perhitungan perbedaannya mungkin akan menimbulkan kesalahan yang sangat besar. Jadi mari kita memikirkan sesuatu yang lebih baik. Untuk mengapa hal ini diperlukan, lihat artikel Wikipedia tentang Algoritma untuk menghitung varians dan John Cook mengenai penjelasan Teoretis untuk hasil numerik) Pertama, daripada menghitung stddev, mari fokus pada variansnya. Begitu kita memiliki variansnya, stddev hanyalah akar kuadrat dari variansnya. Misalkan data dalam array yang disebut x rolling jendela berukuran n oleh satu dapat dianggap sebagai menghapus nilai x0 dan menambahkan nilai xn. Mari kita menunjukkan rata-rata x0..xn-1 dan x1..xn oleh dan masing-masing. Perbedaan antara varians x0..xn-1 dan x1..xn adalah, setelah membatalkan beberapa persyaratan dan penerapan (ab) (ab) (ab): Oleh karena itu variannya terganggu oleh sesuatu yang tidak mengharuskan Anda untuk mempertahankan Jumlah kuadrat, yang lebih baik untuk akurasi numerik. Anda bisa menghitung mean dan varians sekali pada awalnya dengan algoritma yang tepat (metode Welfords). Setelah itu, setiap kali Anda harus mengganti nilai di jendela x0 oleh xn lain Anda memperbarui rata-rata dan varians seperti ini: Terima kasih untuk ini. Saya menggunakannya sebagai dasar implementasi di C untuk CLR. Saya menemukan bahwa, dalam praktiknya, Anda dapat memperbarui seperti newVar yang merupakan angka negatif yang sangat kecil, dan sqrt gagal. Saya memperkenalkan sebuah jika untuk membatasi nilai nol untuk kasus ini. Tidak tahu, tapi stabil. Hal ini terjadi ketika setiap nilai di jendela saya memiliki nilai yang sama (saya menggunakan ukuran jendela 20 dan nilainya adalah 0,5, jika seseorang ingin mencoba dan memperbanyaknya.) Ndash Drew Noakes 26 Jul 13 at 15:25 Ive Menggunakan commons-math (dan berkontribusi pada perpustakaan itu) untuk sesuatu yang sangat mirip dengan ini. Sumbernya yang terbuka, porting ke C harus mudah seperti kue yang dibeli di toko (sudahkah Anda mencoba membuat kue dari awal). Check it out: commons. apache. orgmathapi-3.1.1index. html. Mereka memiliki kelas StandardDeviation. Pergi ke kota menjawab 31 Jan 13 at 21:48 Anda selamat datang maaf saya tidak memiliki jawaban yang Anda cari. Saya jelas tidak bermaksud menyarankan untuk memasarkan seluruh perpustakaan Hanya kode minimum yang diperlukan, yang seharusnya beberapa ratus baris atau lebih. Perhatikan bahwa saya tidak tahu apa batasan hak cipta hukum yang dimiliki apache pada kode itu, jadi Anda harus memeriksanya. Jika Anda mengejarnya, inilah linknya. Jadi Variance FastMath ndash Jason Jan 31 13 at 22:36 Informasi yang paling penting sudah diberikan di atas --- tapi mungkin ini masih diminati. Sebuah perpustakaan Java kecil untuk menghitung moving average dan standar deviasi tersedia di sini: githubtools4jmeanvar Implementasinya didasarkan pada varian metode Welfords yang disebutkan di atas. Metode untuk menghilangkan dan mengganti nilai telah diturunkan yang bisa digunakan untuk memindahkan nilai windows. Apa yang akan menjadi cara ideal untuk menemukan mean dan standar deviasi sebuah sinyal untuk aplikasi real time. Id ingin bisa memicu pengendali bila sinyal lebih dari 3 standar deviasi off mean untuk jangka waktu tertentu. Im dengan asumsi DSP yang berdedikasi akan melakukan ini dengan mudah, tapi adakah jalan pintas yang mungkin tidak memerlukan sesuatu yang sangat rumit pada 3-11 Desember pukul 5:11. Ada kesalahan dalam jawaban Jason Rs, yang dibahas dalam Knuths Art of Computer Programming vol. 2. Masalahnya muncul jika Anda memiliki standar deviasi yang merupakan sebagian kecil dari mean: perhitungan E (x2) - (E (x) 2) mengalami sensitivitas yang parah terhadap kesalahan pembulatan floating point. Anda bahkan dapat mencoba ini sendiri dengan skrip Python: Saya mendapatkan -128.0 sebagai jawaban, yang jelas tidak sesuai secara komputasi, karena matematika memprediksi bahwa hasilnya seharusnya tidak negatif. Knuth mengutip sebuah pendekatan (saya tidak ingat nama penemu) untuk menghitung mean dan deviasi standar berjalan yang berjalan seperti ini: dan kemudian setelah setiap langkah, nilai m adalah meannya, dan standar deviasi dapat dihitung sebagai sqrt (Sn) atau sqrt (Sn-1) tergantung pada definisi favorit Anda tentang standar deviasi. Persamaan yang saya tulis di atas sedikit berbeda dari yang ada di Knuth, namun komputasinya setara. Ketika saya memiliki beberapa menit lagi, kode III rumus di atas dengan Python dan menunjukkan bahwa Anda akan mendapatkan jawaban yang tidak negatif (yang mudah-mudahan mendekati nilai yang benar). Update: ini dia Anda akan tahu bahwa masih ada beberapa kesalahan pembulatan, tapi tidak buruk, sedangkan naif hanya pukes. Edit: Hanya perhatikan komentar Belisariuss yang mengutip Wikipedia yang memang menyebutkan algoritma Knuth. Apa cara ideal untuk menemukan mean dan standar deviasi sebuah sinyal untuk aplikasi real time. Id ingin bisa memicu pengendali bila sinyal lebih dari 3 standar deviasi off mean untuk jangka waktu tertentu. Pendekatan yang tepat dalam situasi seperti ini biasanya untuk menghitung rata-rata berjalan tertimbang secara eksponensial dan standar deviasi. Dalam rata-rata tertimbang secara eksponensial, perkiraan mean dan varians bias terhadap sampel terbaru yang memberi Anda perkiraan mean dan varians selama detik terakhir. Yang mungkin yang Anda inginkan, daripada rata-rata aritmatika biasa di atas semua sampel yang pernah ada. Dalam domain frekuensi, rata-rata berjalan tertimbang secara eksponensial hanyalah sebuah tiang nyata. Hal ini mudah diterapkan dalam domain waktu. Implementasi domain waktu Misalkan mean dan meanq adalah perkiraan rata-rata dan mean kuadrat sinyal saat ini. Pada setiap siklus, perbarui perkiraan ini dengan sampel baru x: Here 0 lt a lt 1 adalah konstanta yang menentukan panjang efektif dari rata-rata yang berjalan. Cara memilihnya dijelaskan di bawah ini dalam analisis. Apa yang dinyatakan di atas sebagai program imperatif juga dapat digambarkan sebagai diagram alir sinyal: Algoritma di atas menghitung yi a xi (1-a) y dimana xi adalah input pada sampel i, dan yi adalah output (yaitu perkiraan Artinya). Ini adalah filter single-pole IIR yang sederhana. Mengambil z transform, kita menemukan fungsi transfer H (z) frac. Mengembunkan filter IIR ke dalam blok mereka sendiri, diagramnya sekarang terlihat seperti ini: Untuk menuju ke domain kontinyu, kita membuat substitusi z e dimana T adalah waktu sampel dan fs 1T adalah sample rate. Memecahkan 1- (1-a) e 0, kita menemukan bahwa sistem kontinyu memiliki sebuah tiang pada log frac (1-a). Metode yang telah saya gunakan sebelumnya dalam aplikasi pemrosesan tertanam adalah untuk menjaga akumulator jumlah dan jumlah kuadrat sinyal kepentingan: Juga, catat saat ini instan i dalam persamaan di atas (yaitu, perhatikan nomornya Dari sampel yang telah Anda tambahkan ke akumulator). Kemudian, mean sampel dan standar deviasi pada waktu saya adalah: sigma2 operatorname (X2) - (nama operator (X)) 2 Saya telah menggunakan ini dengan sukses di masa lalu (walaupun saya hanya memperhatikan estimasi varians, bukan standar deviasi), walaupun Anda Harus berhati-hati dengan tipe numerik yang Anda gunakan untuk menampung akumulator jika Anda akan menjumlahkan dalam jangka waktu lama yang Anda inginkan tidak meluap. Edit: Selain komentar di atas mengenai overflow, perlu dicatat bahwa algoritma ini bukanlah algoritma numerik yang kuat bila diimplementasikan pada floating point aritmatika, yang berpotensi menyebabkan kesalahan besar pada statistik yang diperkirakan. Lihatlah jawaban Jason Ss untuk pendekatan yang lebih baik dalam kasus itu. Jawab 6 Desember pukul 13:34 Tampaknya ada beberapa kesalahan ketik di sini. Mengapa mean dikurangi di bawah tanda akar kuadrat untuk sigma maka harus sesuai dengan persamaan yang ditampilkan sigma2 E (X2) - (E (X)) 2, tidak Juga, meskipun saya tidak akan memberikan suara atas jawaban ini, saya setuju dengan persamaan Jason S bahwa ada masalah numerik dalam pendekatan ini. Ndash Dilip Sarwate Jan 20 12 at 1:33 Mirip dengan jawaban pilihan di atas (Jason S.), dan juga diturunkan dari rumus yang diambil dari Knut (Vol.2, p 232), seseorang juga dapat menurunkan formula untuk mengganti nilai , Yaitu menghapus dan menambahkan nilai dalam satu langkah. Menurut tes saya, ganti memberikan presisi lebih baik daripada versi removeadd dua langkah. Kode di bawah ini di Jawa, mean dan s mendapatkan update (variabel anggota global), sama seperti m dan s di atas dalam posting Jasons. Perhitungan nilai mengacu pada ukuran jendela n.

No comments:

Post a Comment