Solusi ini mengimplementasikan saran yang dibuat oleh @Innuo dalam komentar untuk pertanyaan:
Anda dapat mempertahankan subset acak yang seragam dengan ukuran 100 atau 1000 dari semua data yang terlihat sejauh ini. Set ini dan "pagar" yang terkait dapat diperbarui dalam waktu .O(1)
Setelah kami tahu cara mempertahankan subset ini, kami dapat memilih metode apa pun yang kami suka untuk memperkirakan rata-rata populasi dari sampel tersebut. Ini adalah metode universal, tidak membuat asumsi apa pun, yang akan bekerja dengan aliran input apa pun dalam keakuratan yang dapat diprediksi menggunakan rumus sampling statistik standar. (Akurasi berbanding terbalik dengan akar kuadrat dari ukuran sampel.)
Algoritma ini menerima sebagai input aliran data t = 1 , 2 , ... , ukuran sampel m , dan menampilkan aliran sampel s ( t ) yang masing-masing mewakili populasi X ( t ) = ( x ( 1 ) , x ( 2 ) , ... , x ( t ) ) . Khususnya, untuk 1 ≤ i ≤x(t), t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t)) , s ( i ) adalah sampel acak sederhana berukuran m dari X ( t ) (tanpa penggantian).1≤i≤ts(i)mX(t)
Agar hal ini terjadi, cukup bahwa setiap subset elemen dari { 1 , 2 , ... , t } memiliki peluang yang sama untuk menjadi indeks x dalam s ( t ) . Ini menyiratkan kemungkinan bahwa x ( i ) , 1 ≤ i < t , dalam s ( t ) sama dengan m / t asalkan t ≥ m .m{1,2,…,t}xs(t)x(i), 1 ≤ i < t ,s ( t )m / tt ≥ m
Pada awalnya kami hanya mengumpulkan aliran sampai elemen telah disimpan. Pada saat itu hanya ada satu sampel yang mungkin, sehingga kondisi probabilitas sepele terpenuhi.m
Algoritma mengambil alih ketika . Anggaplah secara induktif bahwa s ( t ) adalah sampel acak sederhana X ( t ) untuk t > m . Sementara set s ( t + 1 ) = s ( t ) . Misalkan U ( t + 1 ) menjadi variabel acak seragam (tidak tergantung dari variabel sebelumnya yang digunakan untuk membangun s ( t ) ). Jikat=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t) kemudian ganti elemen s yang dipilih secara acakdengan x ( t + 1 ) . U(t+1)≤m/(t+1)sx ( t + 1 ) Itu seluruh prosedur!
Jelas memiliki probabilitas m / ( t + 1 ) berada di s ( t + 1 ) . Selain itu, dengan hipotesis induksi, x ( i ) memiliki probabilitas m / t berada di s ( t ) ketika saya ≤ t . Dengan probabilitas m / ( t + 1 ) × 1 / mx ( t + 1 )m / ( t + 1 )s ( t + 1 )x ( i )m / ts ( t )saya ≤ tm / ( t + 1 ) × 1 / m= itu akan dihapus dari s ( t + 1 ) , di mana probabilitasnya tetap sama1 / ( t + 1 )s ( t + 1 )
mt( 1 - 1t + 1) = mt + 1,
persis seperti yang dibutuhkan. Dengan induksi, maka, semua probabilitas inklusi dalam s ( t ) benar dan jelas tidak ada korelasi khusus di antara inklusi tersebut. Itu membuktikan algoritma itu benar.x ( i )s ( t )
Efisiensi algoritma adalah karena pada setiap tahap paling banyak dua angka acak dihitung dan paling banyak satu elemen dari array nilai m diganti. Persyaratan penyimpanan adalah O ( m ) .O ( 1 )mO ( m )
Struktur data untuk algoritma ini terdiri dari sampel bersama-sama dengan indeks t dari populasi Xst yang sampel. Awalnya kami mengambil s = X ( m ) dan melanjutkan dengan algoritma untuk t = m + 1 , m + 2 , … . Berikut ini adalahimplementasi untuk memperbarui ( s , t ) dengan nilai x untuk menghasilkan ( s , t +X( t )s = X( m )t = m + 1 , m + 2 , … .R
( s , t )x . (Argumenmemainkan peran t danadalah m . Indeks t akan dipertahankan oleh pemanggil.)( s , t + 1 )n
tsample.size
mt
update <- function(s, x, n, sample.size) {
if (length(s) < sample.size) {
s <- c(s, x)
} else if (runif(1) <= sample.size / n) {
i <- sample.int(length(s), 1)
s[i] <- x
}
return (s)
}
Untuk menggambarkan dan menguji ini, saya akan menggunakan penduga rata-rata (tidak-kuat) rata-rata dan membandingkan rata-rata seperti yang diperkirakan dari dengan rata-rata aktual X ( t ) (kumpulan data kumulatif yang terlihat pada setiap langkah ). Saya memilih aliran input yang agak sulit yang berubah cukup lancar tetapi secara berkala mengalami lompatan dramatis. Ukuran sampel m = 50 cukup kecil, memungkinkan kami untuk melihat fluktuasi sampel dalam plot ini.s ( t )X( t )m = 50
n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
s <<- update(s, x[i], i, n.sample)
summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))
Pada titik ini online
adalah urutan estimasi rata-rata yang dihasilkan dengan mempertahankan sampel yang berjalan ini dari nilai sedangkan urutan estimasi rata-rata dihasilkan dari semua data yang tersedia pada setiap saat. Plot menunjukkan data (berwarna abu-abu), (hitam), dan dua aplikasi independen dari prosedur pengambilan sampel ini (berwarna). Perjanjian tersebut dalam kesalahan pengambilan sampel yang diharapkan:50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Untuk penaksir yang kuat dari rata-rata, silakan cari situs kami untuk pencilan dan istilah terkait. Di antara kemungkinan yang layak dipertimbangkan adalah sarana Winsorized dan penaksir-M.