Reservoir Sampling distribué - énoncé¶
Reservoir Sampling sur Map/Reduce. Cet algorithme est un algorithme d’échantillonnage en streaming.
Reservoir Sampling¶
Le reservoir sampling est une façon de tirer un échantillon aléatoire de nombres parmi nombres qui ne nécessite pas de conserver ces nombres en mémoire.
[1]:
ensemble = ["%d%s" % (i, chr(i % 26 + 97)) for i in range(0, 10000)]
ensemble[:5]
[1]:
['0a', '1b', '2c', '3d', '4e']
[2]:
import random
def reservoir_sampling(ensemble, k):
N = len(ensemble)
echantillon = []
for i, e in enumerate(ensemble):
if len(echantillon) < k:
echantillon.append(e)
else:
j = random.randint(0, i - 1)
if j < k:
echantillon[j] = e
return echantillon
reservoir_sampling(ensemble, 10)
[2]:
['6718k',
'9595b',
'1964o',
'2868i',
'932w',
'4092k',
'9847t',
'9087n',
'9804c',
'6083z']
Le reservoir sampling reproduit un tirage sans remise. L’algorithme habituel - on tire éléments parmi , la probabilité qu’un élément fasse partie de l’échantillon est de :
Dans le cas du reservoir sampling, on doit s’assurer que chaque élément à la même probabilité de faire partie de l’échantillon. On procède par récurrence. Le résultat est vrai pour . On suppose que est vrai à l’ordre . La probabilité qu’un élément de l’ensemble fasse partie de l’échantillon est . A l’ordre , il y a une probabilité de remplacer un des éléments de l’échantillon. L’élément a donc une probabilité de faire partie de l’échantillon. Pour les éléments faisant déjà partie de l’échantillon, leur probabilité de rester est . La probabilité qu’un élément présent dans l’échantillon soit dans l’échantillon à l’itération est de . L’échantillon produit par le reservoir sampling a les mêmes propriétés qu’un échantillon produit avec un tirage sans remise.
Cet algorithme est intéressent lorsqu’on veut échantillonner sur une grande base de données car il nécessite de ne garder en mémoire que l’échantillon.
Reservoir Sampling Distribué¶
Distribuer l’algorithme paraît simple : une partie des données ira sur une machine qui en tirera un échantillon, l’autre machine tirera un échantillon aléatoire sur l’autre partie des données. Par extension, sur machines, on obtient échantillons de tailles tirés sur des ensembles de tailles . Il faut s’assurer que la version distribuée produit un échantillon avec les mêmes propriétés.
exercice 1 : combinaison¶
Comment recombiner ces échantillons aléatoires ? Comment choisir les sachant qu’on doit tirer un échantillon de taille parmi ?
[ ]:
exercice 2 : script Spark¶
Ecrire le script Spark correspondant à l’algorithme.
[ ]:
Petit problème théorique¶
Un Générateur congruentiel linéaire imite seulement le hasard, ce n’est pas vraiment le hasard. La suite dépend d’une graine ou seed. Si deux machines partent de la même graine, elle produiront la même suite. Qu’en est-il du hasard ? La solution de l’exercice précédent est-elle correcte d’un point de statistique ?
Reservoir Sampling pondéré¶
On serait tenter d’écrire… On suppose qu’on dispose un ensemble de points pondéré par . On veut tirer un échantillon de éléments. On procède de la même manière que pour le reservoir sampling non pondéré. A l’étape , on dispose d’un échantillon . On tire un nombre selon une loi uniforme . On ajoute l’élément si :
On veut montrer que pour tout :
On procède par récurrence en supposant cela vrai à l’ordre , donc . On vérifie que cela est vrai pour . Mais a priori, il n’y a aucune raison que cela soit vrai.
Il faut faire autrement.
On utilise l’algorithme A-Res. Soit pondéré par qui sont différents des . On considère l’élément pondéré par . On l’ajoute à si :
Si la condition est vérifié, on enlève l’observation associé au minimum et on le remplace par le point pondéré par .
Dans le cas uniforme, . Si on considère tous les nombres aléatoires , et qu’on les trie par ordre croissant . Dans ce cas, . Comme les nombres sont tirés selon une loi uniforme, . On retrouve l’algorithme précédent. Cette probabilité ne change pas lorsque car les nombres sont identiquement distribués.
On s’intéresse maintenant au cas où les poids ne sont pas identiques. On associe à chaque élément de poids un nombre où un nombre aléatoire appartient tiré selon une loi uniforme. On trie ces par ordre croissant : . A l’itération , l’échantillon est .
La fonction de répartition d’une variable aléatoire est définie par . On suppose que , la loi de est .
[ ]: