Cette solution met en œuvre une suggestion faite par @Innuo dans un commentaire à la question:
Vous pouvez conserver un sous-ensemble aléatoire échantillonné uniformément de taille 100 ou 1000 à partir de toutes les données vues jusqu'à présent. Cet ensemble et les "clôtures" associées peuvent être mis à jour en temps .O(1)
Une fois que nous savons comment maintenir ce sous-ensemble, nous pouvons sélectionner n'importe quelle méthode que nous aimons pour estimer la moyenne d'une population à partir d'un tel échantillon. Il s'agit d'une méthode universelle, ne faisant aucune hypothèse, qui fonctionnera avec n'importe quel flux d'entrée avec une précision qui peut être prédite à l'aide de formules d'échantillonnage statistique standard. (La précision est inversement proportionnelle à la racine carrée de la taille de l'échantillon.)
Cet algorithme accepte en entrée un flux de données une taille d'échantillon , et génère un flux d'échantillons chacun représente la population . Plus précisément, pour , est un simple échantillon aléatoire de taille de (sans remplacement).x(t), t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t))1≤i≤tm X ( t )s(i)mX(t)
Pour cela, il suffit que chaque sous-ensemble de éléments de ait des chances égales d'être les indices de dans . Cela implique la chance que soit en est égal à condition que .{ 1 , 2 , … , t } x s ( t ) x ( i ) , 1 ≤ i < t , s ( t ) m / t t ≥ mm{1,2,…,t}xs(t)x(i), 1≤i<t,s(t)m/tt≥m
Au début, nous collectons simplement le flux jusqu'à ce que éléments aient été stockés. À ce stade, il n'y a qu'un seul échantillon possible, de sorte que la condition de probabilité est trivialement satisfaite.m
L'algorithme prend le relais lorsque . Supposons par induction que est un simple échantillon aléatoire de pour . Définir provisoirement . Soit une variable aléatoire uniforme (indépendante de toute variable précédente utilisée pour construire ). Si alors remplacez un élément choisi au hasard de par . C'est toute la procédure!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)
Clairement, a une probabilité d'être en . De plus, par l'hypothèse d'induction, avait une probabilité d'être dans lorsque . Avec une probabilité = elle aura été supprimée de , d'où sa probabilité de rester égalex(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,
exactement au besoin. Par induction, donc, toutes les probabilités d'inclusion de dans sont correctes et il est clair qu'il n'y a pas de corrélation particulière entre ces inclusions. Cela prouve que l'algorithme est correct.x(i)s(t)
L'efficacité de l'algorithme est car à chaque étape, au plus deux nombres aléatoires sont calculés et au plus un élément d'un tableau de valeurs est remplacé. Le besoin de stockage est de .O(1)mO(m)
La structure de données de cet algorithme se compose de l'échantillon ainsi que de l'indice de la population qu'il échantillonne. Initialement, nous prenons et procédons à l'algorithme pour Voici une implémentation à mettre à jour avec une valeur à produire . (L'argument joue le rôle de et est . L'index sera maintenu par l'appelant.)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)
}
Pour illustrer et tester cela, j'utiliserai l'estimateur habituel (non robuste) de la moyenne et comparerai la moyenne estimée de à la moyenne réelle de (l'ensemble cumulatif de données vues à chaque étape ). J'ai choisi un flux d'entrée quelque peu difficile qui change assez facilement mais subit périodiquement des sauts spectaculaires. La taille de l'échantillon de est assez petite, ce qui nous permet de voir les fluctuations d'échantillonnage dans ces parcelles.X ( t ) m = 50s(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]))
À ce stade, online
est la séquence d'estimations moyennes produites en maintenant cet échantillon de valeurs, tandis que la séquence d'estimations moyennes est produite à partir de toutes les données disponibles à chaque instant. Le graphique montre les données (en gris), (en noir) et deux applications indépendantes de cette procédure d'échantillonnage (en couleurs). L'accord correspond à l'erreur d'échantillonnage attendue:50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
Pour des estimateurs robustes de la moyenne, veuillez rechercher sur notre site les valeurs aberrantes et les termes connexes. Parmi les possibilités qui méritent d'être étudiées figurent les moyennes winsorisées et les estimateurs M.