Algoritma untuk secara dinamis memonitor kuantil


24

Saya ingin memperkirakan jumlah beberapa data. Data tersebut sangat besar sehingga tidak dapat ditampung dalam memori. Dan data tidak statis, data baru terus berdatangan. Adakah yang tahu algoritma untuk memonitor kuantil data yang diamati sejauh ini dengan memori dan komputasi yang sangat terbatas? Saya menemukan algoritma P2 berguna, tetapi tidak berfungsi dengan baik untuk data saya, yang didistribusikan dengan sangat berat.


Untuk beberapa gagasan (dalam konteks perkiraan median) lihat utas di stats.stackexchange.com/q/346/919 .
whuber

3
Pertanyaan ini crossposted di math.SE.
kardinal

Jawaban:


16

Algoritma P2 adalah temuan yang bagus. Ia bekerja dengan membuat beberapa perkiraan kuantil, memperbaruinya secara berkala, dan menggunakan interpolasi kuadrat (bukan linier, bukan kubik) untuk memperkirakan kuantil. Para penulis mengklaim interpolasi kuadrat bekerja lebih baik di ekor daripada interpolasi linier dan kubik akan menjadi terlalu rewel dan sulit.

Anda tidak menyatakan dengan tepat bagaimana pendekatan ini gagal untuk data "ekor berat" Anda, tetapi mudah ditebak: perkiraan kuantil ekstrem untuk distribusi berekor berat akan tidak stabil hingga sejumlah besar data dikumpulkan. Tapi ini akan menjadi masalah (pada tingkat lebih rendah) bahkan jika Anda menyimpan semua data, jadi jangan berharap keajaiban!

Bagaimanapun juga, mengapa tidak menetapkan marker bantu - sebut saja mereka dan --dengan mana Anda sangat yakin quantile akan berbohong, dan simpan semua data yang terletak di antara dan ? Saat buffer Anda terisi, Anda harus memperbarui marker ini, selalu simpan . Algoritma sederhana untuk melakukan ini dapat dibuat dari kombinasi (a) estimasi P2 saat ini dari kuantil dan (b) jumlah jumlah data yang disimpan kurang dari dan jumlah data lebih besar dari . Dengan cara ini Anda dapat, dengan kepastian tinggi, memperkirakan kuantil sama baiknya jika Anda memiliki seluruh dataset yang selalu tersedia, tetapi Anda hanya membutuhkan buffer yang relatif kecil.x 6 x 0 x 6 x 0x 6 x 0 x 6x0x6x0x6x0x6x0x6

Secara khusus, saya mengusulkan struktur data untuk mempertahankan informasi parsial tentang urutan nilai data . Di sini, adalah daftar tertautn x 1 , x 2 , , x n y(k,y,n)nx1,x2,,xny

y=(x[k+1](n)x[k+2](n)x[k+m](n)).

Dalam notasi ini menunjukkan terkecil dari nilai dibaca sejauh ini. adalah konstanta, ukuran buffer . i th n x m yx[i](n)ithn xmy

Algoritma dimulai dengan mengisi dengan nilai data pertama yang ditemui dan menempatkannya dalam urutan diurutkan, terkecil hingga terbesar. Biarkan menjadi kuantil untuk diestimasi; misalnya, = 0,99. Setelah membaca ada tiga tindakan yang mungkin: m q q x n + 1ymqqxn+1

  • Jika , tambahkan . kxn+1<x[k+1](n)k

  • Jika , jangan lakukan apa pun.xn+1>x[k+m](n)

  • Jika tidak, masukkan ke . yxn+1y

Dalam hal apa pun, kenaikan .n

The insert menempatkan prosedur ke dalam rangka diurutkan dan kemudian menghilangkan salah satu nilai ekstrim dalam : y yxn+1yy

  • Jika , maka hapus dari dan increment ;x ( n ) [ k + 1 ] y kk+m/2<nqx[k+1](n)yk

  • Kalau tidak, hapus dari . yx[k+m](n)y

Asalkan cukup besar, prosedur ini akan mengurung kuantil sebenarnya dari distribusi dengan probabilitas tinggi. Pada setiap tahap dapat diperkirakan dengan cara biasa dalam hal dan , yang kemungkinan besar terletak di . (Saya percaya hanya perlu skala seperti akar kuadrat dari jumlah maksimum data ( ), tetapi saya belum melakukan analisis yang ketat untuk membuktikannya.) Bagaimanapun, algoritma akan mendeteksi apakah telah berhasil (oleh membandingkan dan ke ).n x ( n ) [ q n] x ( n ) [ q n] y m N k / n ( k + m ) / n qmnx[qn](n)x[qn](n)ymNk/n(k+m)/nq

Menguji hingga 100.000 nilai, menggunakan dan (kasus paling sulit) menunjukkan algoritma ini memiliki tingkat keberhasilan 99,5% dalam mendapatkan nilai . Untuk aliran nilai , yang akan membutuhkan buffer hanya dua juta (tetapi tiga atau empat juta akan menjadi pilihan yang lebih baik). Menggunakan daftar tertaut ganda yang diurutkan untuk buffer memerlukan = upaya sambil mengidentifikasi dan menghapus max atau min adalah operasi . Penyisipan yang relatif mahal biasanya hanya perlu dilakukan q=.5x ( n ) [ q n] N=10 12 O(log(m=2Nq=.5x[qn](n)N=1012O(log(N))O(log(N))O(1)O(N)waktu. Dengan demikian biaya komputasi dari algoritma ini adalah dalam waktu dan dalam penyimpanan.O(N+Nlog(N))=O(N)O(N)


Ini adalah karya diperpanjang dari algoritma P2. [tautan] sim.sagepub.com/content/49/4/159.abstract . Penyimpanan masih terlalu banyak untuk aplikasi saya, yang berjalan pada sensor kecil dengan total 10K RAM. Saya dapat mengkonsumsi beberapa ratus byte paling banyak hanya untuk estimasi kuantil.
sinoTrinity

@whuber Sebenarnya saya menerapkan P2 yang diperluas dan mengujinya dengan sampel yang dihasilkan dari berbagai distribusi seperti seragam dan eksponensial, di mana ia bekerja dengan sangat baik. Tetapi ketika saya menerapkannya pada data dari aplikasi saya, yang distribusinya tidak diketahui, kadang-kadang gagal untuk menyatu dan menghasilkan kesalahan relatif (abs (estimasi - aktual) / aktual) hingga 300%.
sinoTrinity

2
@ino Kualitas algoritme dibandingkan dengan menggunakan semua data tidak seharusnya bergantung pada bobot ekor. Cara yang lebih adil untuk mengukur kesalahan adalah ini: misalkan menjadi cdf empiris. Untuk perkiraan q dari q persentil, apa perbedaan antara F ( q ) dan F ( q ) ? Jika berada di urutan 1 / n Anda melakukannya dengan sangat baik. Dengan kata lain, persentil berapa yang dihasilkan algoritma P2 untuk data Anda? Fq^qF(q^)F(q)1/n
whuber

Kamu benar. Saya baru saja mengukur F (qˆ) dan F (q) untuk kasus yang saya sebutkan dengan kesalahan relatif hingga 300%. Untuk q dari 0,7, qˆ hampir 0,7, menghasilkan kesalahan yang dapat diabaikan. Namun, untuk q 0,9, qˆ tampaknya sekitar 0,95. Saya rasa itu sebabnya saya memiliki kesalahan besar hingga 300%. Tahu mengapa itu 0,95, bukan 0,9? BTW, bisakah saya memposting gambar di sini dan bagaimana saya bisa memposting rumus matematika seperti yang Anda lakukan?
sinoTrinity

2
@whuber Saya cukup yakin bahwa implementasi saya sesuai dengan P2 yang diperluas. 0,9 masih pergi ke 0,95 atau bahkan lebih besar ketika saya secara bersamaan memperkirakan 0,8, 0,85, 0,9, 0,95 kuantil. Namun, 0,9 berjalan sangat dekat dengan 0,9 jika 0,8, 0,85, 0,9, 0,95 dan 1,0 kuantil dilacak pada waktu yang sama.
sinoTrinity

5

Saya pikir saran Whuber sangat bagus dan saya akan mencobanya terlebih dahulu. Namun, jika Anda benar-benar tidak dapat mengakomodasi penyimpanan atau tidak berhasil karena beberapa alasan lain, berikut adalah ide untuk generalisasi P2 yang berbeda. Ini tidak sedetail apa yang disarankan whuber - lebih seperti ide penelitian daripada sebagai solusi.O(N)

Alih-alih melacak kuantil pada , p / 2 , p , ( 1 + p ) / 2 , dan 1 , seperti yang disarankan oleh algoritma P2 asli, Anda bisa melacak lebih banyak kuantil (tetapi masih berupa angka konstan). Sepertinya algoritma memungkinkan untuk itu dengan cara yang sangat mudah; yang perlu Anda lakukan adalah menghitung "bucket" yang benar untuk titik yang masuk, dan cara yang tepat untuk memperbarui kuantil (secara kuadrat menggunakan angka yang berdekatan).0p/2p(1+p)/21

Katakanlah Anda melacak poin. Anda bisa mencoba melacak kuantil di 0 , p / 12 , ... , p 11 / 12 , p , p + ( 1 - p ) / 12 , ... , p + 11 ( 1 - p ) / 12 , 1 (memetik titik-titik secara merata di antara 0 dan p , dan antara p250p/12p11/12pp+(1p)/12p+11(1p)/1210ppdan ), atau bahkan menggunakan 22 node Chebyshev dari bentuk p / 2 ( 1 + cos ( 2 i - 1 ) π122 danp+(1-p)/2(1+cos(2i-1)πp/2(1+cos(2i1)π22). Jikapmendekati0atau1, Anda bisa mencoba meletakkan lebih sedikit titik di sisi di mana ada massa probabilitas lebih sedikit dan lebih banyak di sisi lain.p+(1p)/2(1+cos(2i1)π22)p01

Jika Anda memutuskan untuk mengejar ini, saya (dan mungkin orang lain di situs ini) akan tertarik mengetahui jika itu berhasil ...


+1 Saya pikir ini adalah ide bagus mengingat kendala OP. Yang bisa diharapkan hanyalah perkiraan, jadi triknya adalah memilih nampan yang memiliki kemungkinan sempit dan mengandung jumlah yang diinginkan.
whuber



2

Saya akan melihat regresi kuantil. Anda dapat menggunakannya untuk menentukan estimasi parametrik dari kuantil mana pun yang ingin Anda lihat. Itu tidak membuat asumsi tentang normalitas, sehingga ia menangani heteroskedastisitas dengan cukup baik dan dapat digunakan sebagai basis bergulir. Ini pada dasarnya sebuah regresi yang dikenakan sanksi L1-Norm, jadi tidak terlalu intensif secara numerik dan ada paket R, SAS, dan SPSS yang berfitur lengkap lengkap ditambah beberapa implementasi matlab di luar sana. Inilah wiki utama dan paket R untuk info lebih lanjut.

Diedit:

Lihat crosslink exchange stack stack: Seseorang mencari beberapa makalah yang pada dasarnya menguraikan ide yang sangat sederhana hanya menggunakan jendela bergulir statistik pesanan untuk memperkirakan jumlah. Secara harfiah yang harus Anda lakukan adalah mengurutkan nilai dari terkecil ke terbesar, pilih mana yang Anda inginkan kuantil, dan pilih nilai tertinggi dalam kuantil itu. Anda jelas dapat memberikan bobot lebih untuk pengamatan terbaru jika Anda yakin mereka lebih mewakili kondisi aktual saat ini. Ini mungkin akan memberikan perkiraan kasar, tetapi itu cukup sederhana untuk dilakukan dan Anda tidak harus melalui gerakan pengangkatan berat kuantitatif. Hanya pemikiran saja.


1

Dimungkinkan untuk memperkirakan (dan melacak) kuantil secara on-line (yang sama berlaku untuk parameter regresi kuantil). Pada dasarnya, ini bermuara pada penurunan gradien stokastik pada fungsi check-loss yang mendefinisikan regresi-kuantil (kuantil diwakili oleh model yang hanya mengandung intersep), misalnya memperbarui parameter yang tidak diketahui saat dan ketika pengamatan tiba.

Lihat kertas Bell Labs "Estimasi Kuantitas Tambahan untuk Pelacakan Besar-besaran" ( ftp://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/kdd/p516-chen.pdf )


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.