Це рішення реалізує пропозицію, зроблену @Innuo у коментарі до питання:
Ви можете підтримувати рівномірну вибірку випадкової підмножини розміром 100 або 1000 з усіх даних, що бачились дотепер. Цей набір та пов’язані з ним "огорожі" можна оновити за час.O ( 1 )
Як тільки ми знаємо, як підтримувати цей підмножина, ми можемо вибрати будь-який метод, який ми хотіли б оцінити середній показник сукупності з такої вибірки. Це універсальний метод, не допускаючи жодних припущень, який буде працювати з будь-яким вхідним потоком з точністю, яку можна передбачити, використовуючи стандартні статистичні формули вибірки. (Точність обернено пропорційна квадратному кореню розміру вибірки.)
Цей алгоритм приймає як вхідний потік даних x ( t ) , t = 1 , 2 , … , розмір вибірки м, і виводить потік зразків s ( t ) кожен з яких представляє населення Х( t ) = ( x ( 1 ) , x ( 2 ) , … , x ( t ) ). Зокрема, для1 ≤ i ≤ t, s ( i ) являє собою просту випадкову вибірку розміру м з Х( t ) (без заміни).
Щоб це сталося, достатньо кожного мпідмножина елементів { 1 , 2 , … , t } мають рівні шанси бути індексами х в s ( t ). Це передбачає шанс, щоx ( i ) , 1 ≤ i < t , є в s ( t ) дорівнює м / т за умови t ≥ м.
На початку ми просто збираємо потік до тих пір, поки мелементи збережені. На той момент існує лише одна можлива вибірка, тому умова ймовірності задовольняється тривіально.
Алгоритм переймає, коли t=m+1. Індуктивно припустимо, щоs(t) є простою випадковою вибіркою X(t) для t>m. Тимчасово встановленийs(t+1)=s(t). ДозволяєU(t+1) бути рівномірною випадковою змінною (незалежно від будь-яких попередніх змінних, використаних для побудови s(t)). ЯкщоU(t+1)≤m/(t+1) потім замініть випадковим чином обраний елемент s від x(t+1). Ось і вся процедура!
Ясно x(t+1) має ймовірність m/(t+1) перебування в s(t+1). Більше того, за індукційною гіпотезою,x(i) мала ймовірність m/t перебування в s(t) коли i≤t. З вірогідністюm/(t+1)×1/m = 1/(t+1) його буде видалено з s(t+1), звідки ймовірність залишитися дорівнює
mt(1−1t+1)=mt+1,
саме так, як потрібно. Тоді за індукцією всі ймовірності включенняx(i) в s(t)є правильними, і зрозуміло, що немає особливої кореляції серед цих включень. Це доводить, що алгоритм є правильним.
Ефективність алгоритму така O(1) тому що на кожному етапі обчислюється щонайбільше два випадкових числа і не більше одного елемента масиву mзначення замінюються. Вимога зберігання єO(m).
Структура даних для цього алгоритму складається з вибірки s разом з індексом t населення X(t)що це зразки. Спочатку беремоs=X(m) і продовжити алгоритм для t=m+1,m+2,…. Ось R
реалізація для оновлення(s,t) зі значенням x виробляти (s,t+1). (Аргумент n
грає рольtі sample.size
єm. Індексt буде підтримуватися абонентом.)
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)
}
Щоб проілюструвати і протестувати це, я буду використовувати звичайний (ненадійний) оцінювач середнього значення і порівняти середнє значення, оцінене з 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]))
На цьому етапі online
є послідовність середніх оцінок, що виробляються підтриманням цієї робочої вибірки50Значення while actual
- це послідовність середніх оцінок, отриманих з усіх даних, наявних у кожен момент. Діаграма показує дані (сірим кольором), actual
(чорним кольором) та два незалежні програми цієї процедури вибірки (кольорами). Угода знаходиться в межах очікуваної помилки вибірки:
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Для надійних оцінювачів середнього рівня відвідайте наш сайт чужета пов'язані з ними терміни. Серед можливостей, які варто врахувати, - це засоби, що спонсоруються, та М-оцінки.