Diese Lösung implementiert einen Vorschlag von @Innuo in einem Kommentar zur Frage:
Sie können aus allen bisher angezeigten Daten eine gleichmäßig abgetastete zufällige Teilmenge der Größe 100 oder 1000 beibehalten. Dieser Satz und die zugehörigen "Zäune" können in -Zeit aktualisiert werden.O(1)
Sobald wir wissen, wie diese Teilmenge beibehalten werden kann, können wir eine beliebige Methode auswählen , um den Mittelwert einer Population aus einer solchen Stichprobe zu schätzen. Dies ist eine universelle Methode, bei der keinerlei Annahmen getroffen werden und die mit jedem Eingabestream mit einer Genauigkeit funktioniert , die unter Verwendung statistischer Standardstichprobenformeln vorhergesagt werden kann. (Die Genauigkeit ist umgekehrt proportional zur Quadratwurzel der Stichprobengröße.)
x(t), t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t))1≤i≤ts(i)mX(t)
m{1,2,…,t}xs(t)x(i), 1≤i<t,s(t)m/tt≥m
m
t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)≤m/(t+1)sx(t+1)
x(t+1)m/(t+1)s(t+1)x(i)m/ts(t)i≤tm/(t+1)×1/m1/(t+1)s(t+1)
mt(1−1t+1)=mt+1,
x(i)s(t)
O(1)mO(m)
stX(t)s=X(m)t=m+1,m+2,….R
(s,t)x(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)
}
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
50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Für zuverlässige Schätzer des Mittelwerts durchsuchen Sie bitte unsere Website nach Ausreißern und verwandten Begriffen. Zu den erwägenswerten Möglichkeiten zählen Winsorized-Mittel und M-Schätzer.