Saya mencoba menemukan cara untuk menghitung rata-rata kumulatif bergerak tanpa menyimpan jumlah dan total data yang diterima sejauh ini.
Saya menemukan dua algoritme tetapi keduanya perlu menyimpan hitungan:
- rata-rata baru = ((hitungan lama * data lama) + data berikutnya) / hitungan berikutnya
- rata-rata baru = rata-rata lama + (data berikutnya - rata-rata lama) / hitungan berikutnya
Masalah dengan metode ini adalah bahwa hitungan semakin besar dan mengakibatkan hilangnya presisi dalam rata-rata yang dihasilkan.
Cara pertama menggunakan hitungan lama dan hitungan berikutnya yang jelas terpisah 1. Ini membuat saya berpikir bahwa mungkin ada cara untuk menghapus hitungan tetapi sayangnya saya belum menemukannya. Itu membuat saya sedikit lebih jauh, menghasilkan metode kedua tetapi masih ada hitungan.
Apakah itu mungkin, atau apakah saya hanya mencari yang tidak mungkin?
moving-average
pengguna1705674
sumber
sumber
Jawaban:
Anda cukup melakukan:
Di mana
N
jumlah sampel yang ingin Anda ratakan. Perhatikan bahwa perkiraan ini setara dengan rata-rata bergerak eksponensial. Lihat: Hitung rolling / moving average dalam C ++sumber
5
sampel, rata-rata akan menjadi 0,67.avg
diinisialisasi ke0
, Anda berakhir dengan3.36
setelah 55
detik, dan4.46
setelah 10: cpp.sh/2ryql Untuk rata-rata panjang, ini tentu saja merupakan perkiraan yang berguna.Ini mengasumsikan hitungan hanya diubah oleh satu nilai. Jika diubah oleh nilai M maka:
Ini adalah rumus matematika (saya yakin yang paling efisien), percayalah Anda dapat membuat kode lebih lanjut sendiri
sumber
m
nilai-nilai baru yang dimasukkan ke dalam rata-rata baru. Saya percaya bahwa disum of new value
sini dimaksudkan untuk menjumlahkan nilaim
-nilai baru yang digunakan untuk menghitung rata-rata baru.new_average = (old_average * (n-1) + new_value) / n
- Menghapus salah satu pemisah.Dari blog tentang menjalankan penghitungan varians sampel, di mana mean juga dihitung menggunakan metode Welford :
Sayang sekali kami tidak dapat mengunggah gambar SVG.
sumber
Berikut lagi jawabannya korban komentar tentang bagaimana Muis , Abdullah Al-Ageel dan flip jawaban 's adalah semua matematis hal yang sama kecuali ditulis berbeda.
Tentu, kami memiliki analisis José Manuel Ramos yang menjelaskan bagaimana kesalahan pembulatan memengaruhi masing-masing sedikit berbeda, tetapi itu bergantung pada penerapan dan akan berubah berdasarkan bagaimana setiap jawaban diterapkan ke kode.
Namun ada perbedaan yang cukup besar
Ada di Muis 's
N
, Flip 'sk
, dan Abdullah Al-Ageel 'sn
. Abdullah Al-Ageel tidak cukup menjelaskan apa yangn
seharusnya, tetapiN
dank
perbedaannyaN
adalah " jumlah sampel di mana Anda ingin rata-rata lebih " sedangkank
jumlah nilai sampel. (Meskipun saya ragu apakah memanggilN
jumlah sampel itu akurat.)Dan inilah jawabannya di bawah ini. Ini pada dasarnya adalah rata-rata bergerak tertimbang eksponensial lama yang sama dengan yang lain, jadi jika Anda mencari alternatif, berhentilah di sini.
Rata-rata bergerak tertimbang eksponensial
Mulanya:
Untuk setiap nilai:
Perbedaannya adalah
min(counter, FACTOR)
bagiannya. Ini sama dengan mengatakanmin(Flip's k, Muis's N)
.FACTOR
adalah konstanta yang memengaruhi seberapa cepat rata-rata "mengejar" tren terbaru. Semakin kecil angkanya semakin cepat. (1
Ini bukan lagi rata-rata dan hanya menjadi nilai terbaru.)Jawaban ini membutuhkan penghitung berjalan
counter
. Jika bermasalah,min(counter, FACTOR)
bisa diganti dengan justFACTOR
, mengubahnya menjadi jawaban Muis . Masalah dengan melakukan ini adalah rata-rata bergerak dipengaruhi oleh apa punaverage
yang dimulai. Jika itu diinisialisasi ke0
, nol itu bisa memakan waktu lama untuk bekerja di luar rata-rata.Bagaimana hasilnya nanti
sumber
max(counter, FACTOR)
.min(counter, FACTOR)
akan selalu mengembalikan FACTOR, bukan?min(counter, FACTOR)
adalah memperhitungkan periode pemanasan. Tanpanya, jika FAKTOR Anda (atau N, atau jumlah sampel yang diinginkan) adalah 1000, maka Anda memerlukan setidaknya 1000 sampel sebelum Anda mendapatkan hasil yang akurat, karena semua pembaruan sebelumnya akan menganggap Anda memiliki 1000 sampel, padahal Anda mungkin hanya memiliki 20.Jawaban Flip secara komputasi lebih konsisten daripada jawaban Muis.
Menggunakan format angka ganda, Anda bisa melihat masalah pembulatan dalam pendekatan Muis:
Saat Anda membagi dan mengurangi, pembulatan muncul di nilai yang disimpan sebelumnya, mengubahnya.
Namun, pendekatan Flip mempertahankan nilai yang disimpan dan mengurangi jumlah divisi, karenanya, mengurangi pembulatan, dan meminimalkan kesalahan yang disebarkan ke nilai yang disimpan. Menambahkan hanya akan memunculkan pembulatan jika ada sesuatu untuk ditambahkan (ketika N besar, tidak ada yang ditambahkan)
Perubahan tersebut luar biasa ketika Anda membuat rata-rata nilai yang besar cenderung ke nol.
Saya tunjukkan hasilnya menggunakan program spreadsheet:
Pertama, hasil yang diperoleh:
Kolom A dan B masing-masing adalah nilai n dan X_n.
Kolom C adalah pendekatan Flip, dan D adalah pendekatan Muis, hasilnya disimpan dalam mean. Kolom E sesuai dengan nilai media yang digunakan dalam perhitungan.
Grafik yang menunjukkan rata-rata nilai genap adalah yang berikutnya:
Seperti yang Anda lihat, ada perbedaan besar antara kedua pendekatan tersebut.
sumber
Contoh penggunaan javascript, sebagai perbandingan:
https://jsfiddle.net/drzaus/Lxsa4rpz/
Tampilkan cuplikan kode
sumber
Di Java8:
kamu juga punya
IntSummaryStatistics
,DoubleSummaryStatistics
...sumber
Solusi Python yang rapi berdasarkan jawaban di atas:
pemakaian:
sumber