Méthode des alias

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article est orphelin. Moins de trois articles lui sont liés ().

Vous pouvez aider en ajoutant des liens vers [[Méthode des alias]] dans les articles relatifs au sujet.

Page d’aide sur l’homonymie

Pour les articles homonymes, voir Alias.

En informatique, la méthode des alias permet de simuler des variables aléatoires à support fini, en temps constant. Elle a été publié en 1974 par A. J. Walker[1],[2].

Contexte

On considère une variable aléatoire X {\displaystyle X} et la distribution de probabilité que X {\displaystyle X} vaille i {\displaystyle i} est p i {\displaystyle p_{i}} pour tout entier i = 1 n {\displaystyle i=1\dots n} . On souhaite simuler la variable X {\displaystyle X} . Une méthode classique pour la simulation est la méthode de la transformée inverse. Malheureusement, elle se reformule comme un algorithme en O ( n ) {\displaystyle O(n)} . Il peut être optimisé en O ( log n ) {\displaystyle O(\log n)} à l'aide d'un arbre binaire de recherche. La méthode des alias, elle, donne une simulation en temps constant O ( 1 ) {\displaystyle O(1)} .

Idée générale

Idée générale du prétraitement. On répartit la distribution de probabilités. Ici, nous avons une distribution non uniforme sur 5 éléments que l'on répartit uniformément. Chaque alvéole contient in fine 1 ou 2 éléments. Ici, à la fin, la 3e et 5e alvéoles ont un alias.

La méthode commence par un prétraitement en O ( n ) {\displaystyle O(n)} ou O ( n log n ) {\displaystyle O(n\log n)} selon l'algorithme utilisé. L'idée du prétraitement est de répartir la distribution de probabilités dans n {\displaystyle n} alvéoles, une pour chaque élément i = 1 n {\displaystyle i=1\dots n} . Une fois la répartition faite, l'alvéole numéro i {\displaystyle i} , contient soit un unique élément i {\displaystyle i} , soit l'élément initial i {\displaystyle i} ainsi qu'un autre élément, que l'on appelle l'alias, et que l'on note ici a l i a s [ i ] {\displaystyle alias[i]} . En d'autres termes, ce prétraitement construit une structure de données.

Ensuite, on peut générer des valeurs pour X {\displaystyle X} selon la distribution données par les p i {\displaystyle p_{i}} en temps constant O ( 1 ) {\displaystyle O(1)} de la façon suivante. On tire de manière uniforme un nombre réel entre 1 et n {\displaystyle n} . Ce dernier donne une certaine alvéole i {\displaystyle i} . On renvoie i {\displaystyle i} ou a l i a s [ i ] {\displaystyle alias[i]} selon que l'on dépasse un seuil.

Génération d'un élément

Un diagramme qui représente la structure de données sous-jacente pour la distribution〈0.25, 0.3, 0.1, 0.2, 0.15〉.

Avant de décrire le prétraitement pour construire la structure de données, décrivons la génération à partir de cette structure. On considère les entiers i = 1 , 2 , 3 , 4 , 5 {\displaystyle i=1,2,3,4,5} . Nous avons deux tableaux p r o b {\displaystyle prob} et a l i a s {\displaystyle alias}  : p r o b [ i ] {\displaystyle prob[i]} est une valeur de seuil et a l i a s [ i ] {\displaystyle alias[i]} est l'alias de i {\displaystyle i} .

La figure de droite montre une telle structure. On a p r o b = [ 1 , 1 , 0.5 , 1 , 0.75 ] {\displaystyle prob=[1,1,0.5,1,0.75]} et a l i a s = [ u n d e f i n e d , u n d e f i n e d , 2 , u n d e f i n e d , 1 ] {\displaystyle alias=[undefined,undefined,2,undefined,1]} .


L'étape de prétraitement, autrement dit, le calcul de p r o b {\displaystyle prob} et a l i a s {\displaystyle alias} à partir de p 1 , , p n {\displaystyle p_{1},\dots ,p_{n}} est donnée dans la section suivante. Décrivons en premier lieu comment simuler une variable aléatoire X {\displaystyle X} . Pour cela, on procède comme suit :

  1. On génère un nombre réel U {\displaystyle U} de manière uniforme entre 1 et n {\displaystyle n}
  2. On considère l'alvéole numéro i := U {\displaystyle i:=\lfloor U\rfloor }
  3. Dans cette alvéole, on regarde la valeur de U i {\displaystyle U-i} .
  4. Si cette valeur est inférieure au seuil p r o b [ i ] {\displaystyle prob[i]} alors on renvoie i {\displaystyle i} , sinon on renvoie a l i a s [ i ] {\displaystyle alias[i]} .

Prétraitement

Dans cette section, on décrit comment construire les tableaux p r o b {\displaystyle prob} et a l i a s {\displaystyle alias} . On commence avec p r o b [ i ] = n p i {\displaystyle prob[i]=np_{i}} pour tout i = 1 n {\displaystyle i=1\dots n} et a l i a s {\displaystyle alias} un tableau vide de n {\displaystyle n} cases de valeur indéfinie. On distingue trois types de cases :

  • les cases trop pleines avec p r o b [ i ] > 1 {\displaystyle prob[i]>1}
  • les cases non pleines avec p r o b [ i ] < 1 {\displaystyle prob[i]<1} et a l i a s [ i ] {\displaystyle alias[i]} non défini
  • les cases parfaites avec p r o b [ i ] = 1 {\displaystyle prob[i]=1} ou alors ( p r o b [ i ] < 1 {\displaystyle prob[i]<1} et a l i a s [ i ] {\displaystyle alias[i]} défini)

L'algorithme de prétraitement fonctionne comme suit. On exécute les étapes suivantes tant que les cases ne sont pas toutes parfaites :

  1. choisir arbitrairement une case d'indice i {\displaystyle i} trop pleine, ainsi qu'une case d'indice j {\displaystyle j} non pleine
  2. faire l'assignation a l i a s [ j ] := i {\displaystyle alias[j]:=i} afin de compléter l'espace libre de la case j {\displaystyle j}
  3. L'idée est que la proportion de i {\displaystyle i} a été déplacée vers la case j {\displaystyle j} en tant qu'alias, il faut corriger la case i {\displaystyle i}  : p r o b [ i ] = p r o b [ i ] ( 1 p r o b [ j ] ) = p r o b [ i ] + p r o b [ j ] 1 {\displaystyle prob[i]=prob[i]-(1-prob[j])=prob[i]+prob[j]-1}

A la fin de l'itération, la case j {\displaystyle j} devient parfaite. La case i {\displaystyle i} , elle, qui était trop pleine peut soit rester trop pleine, soit devenir parfaite, soit devenir non pleine. En tout cas, le nombre de cases parfaites croit strictement au cours de l'algorithme. Donc, il y a au plus n {\displaystyle n} itérations des étapes 1, 2, 3. Chaque itération peut être implémentée en temps constant. Donc le prétraitement peut être implémenté en temps O ( n ) {\displaystyle O(n)} .

Optimisation

Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ?
Une répartition non optimale où 3 éléments (le 1er, le 3e et le 5e) finissent par avoir un alias.

Comme dit précédemment, il n'y a pas unicité de la structure de données. Par exemple, l'animation ci-dessus et la structure données donné en exemple donne un alias pour le 3e élément (alias qui est 2) et pour le 5 élément (alias qui est 1). Nous avons donc deux éléments qui possèdent un alias. Mais il existe d'autres répartitions comme le montre l'animation ci-contre. L'algorithme de prétraitement donné dans la section précédente peut donner plusieurs structures, selon les choix de i {\displaystyle i} et j {\displaystyle j} .

Ainsi, on peut chercher à minimiser le nombre d'éléments possédant un alias. Ainsi, la génération est encore plus rapide (même si c'était déjà en temps constant !) car on évite la comparaison au seuil et la lecture dans la table des alias. Malheureusement, le problème de décision associé à ce problème d'optimisation est NP-difficile[3][source insuffisante]. Mais on peut utiliser un algorithme glouton : voler aux plus riches pour donner aux plus pauvres. Autrement dit, on choisit i {\displaystyle i} avec p r o b [ i ] {\displaystyle prob[i]} maximal et j {\displaystyle j} avec p r o b [ j ] {\displaystyle prob[j]} minimal. Cela demande de trier un tableau et on montre que l'on peut implémenter le prétraitement en O ( n log n ) {\displaystyle O(n\log n)} .

Algorithmes

Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ?

Notes et références

  1. A. J. Walker, « New fast method for generating discrete random numbers with arbitrary frequency distributions », Electronics Letters, vol. 10, no 8,‎ , p. 127 (DOI 10.1049/el:19740097, Bibcode 1974ElL....10..127W)
  2. A. J. Walker, « An Efficient Method for Generating Discrete Random Variables with General Distributions », ACM Transactions on Mathematical Software, vol. 3, no 3,‎ , p. 253–256 (DOI 10.1145/355744.355749 Accès libre, S2CID 4522588)
  3. (en) George Marsaglia, Wai Wan Tsang et Jingbo Wang, « Fast Generation of Discrete Random Variables », Journal of Statistical Software, vol. 11,‎ , p. 1–11 (ISSN 1548-7660, DOI 10.18637/jss.v011.i03, lire en ligne, consulté le )
  • icône décorative Portail de l’informatique