En informática , el método de alias es una familia de algoritmos eficientes para el muestreo de una distribución de probabilidad discreta , publicado en 1974 por AJ Walker. [1] [2] Es decir, devuelve valores enteros 1 ≤ i ≤ n de acuerdo con alguna distribución de probabilidad arbitraria p i . Los algoritmos suelen utilizar un tiempo de preprocesamiento O ( n log n ) u O ( n ) , después del cual se pueden extraer valores aleatorios de la distribución en O (1)tiempo. [3]
Internamente, el algoritmo consulta dos tablas, una tabla de probabilidad U i y una tabla de alias K i (para 1 ≤ i ≤ n ). Para generar un resultado aleatorio, se tira un dado justo para determinar un índice en las dos tablas. Sobre la base de la probabilidad almacenada en ese índice, una moneda sesgada a continuación, se da la vuelta, y el resultado de la tapa se utiliza para elegir entre un resultado de i y K i . [4]
Más concretamente, el algoritmo funciona de la siguiente manera:
Una formulación alternativa de la tabla de probabilidad, propuesta por Marsaglia et. Alabama. [5] como método de "histograma cuadrado", utiliza la condición x < V i en el tercer paso (donde V i = ( U i + i - 1) / n ) en lugar de calcular y .
La distribución puede rellenarse con probabilidades adicionales p i = 0 para aumentar n a un valor conveniente, como una potencia de dos.
Para generar la tabla, primero inicialice U i = np i . Mientras hace esto, divida las entradas de la tabla en tres categorías:
Si U i = 1 , el valor correspondiente K i nunca será consultado y no es importante, pero un valor de K i = i es sensato.
Siempre que no todas las entradas de la tabla estén exactamente llenas, repita los siguientes pasos:
Cada iteración mueve al menos una entrada a la categoría "exactamente completa" (y la última mueve dos), por lo que se garantiza que el procedimiento terminará después de n −1 iteraciones como máximo . Cada iteración se puede realizar en O (1) tiempo, por lo que la tabla se puede configurar en O ( n ) tiempo.
Vose [3] : 974 señala que los errores de redondeo de coma flotante pueden hacer que se viole la garantía mencionada en el paso 1. Si una categoría se vacía antes que la otra, las entradas restantes pueden tener U i establecida en 1 con un error insignificante. La solución que tiene en cuenta el punto flotante a veces se denomina método de Walker-Vose o método de alias de Vose .
La estructura de Alias no es única.
A medida que el procedimiento de búsqueda es un poco más rápido si y < T i (porque K i no es necesario que se consulte), uno de los objetivos durante la generación de la tabla es maximizar la suma de la U i . Hacer esto de manera óptima resulta ser NP difícil , [5] : 6 pero un algoritmo codicioso se acerca razonablemente: robar a los más ricos y dar a los más pobres. Es decir, en cada paso elija la mayor U i y la menor U j . Debido a que esto requiere ordenar la U i , requiere O ( n logn ) tiempo.
Aunque el método de alias es muy eficiente si generar un desvío uniforme es en sí mismo rápido, hay casos en los que está lejos de ser óptimo en términos de uso de bits aleatorios. Esto se debe a que utiliza una variable aleatoria x de precisión total cada vez, incluso cuando solo se necesitan unos pocos bits aleatorios.
Un caso surge cuando las probabilidades están particularmente bien equilibrados, por lo que muchos U i = 1 y K i no es necesario. Generar y es una pérdida de tiempo. Por ejemplo, si p 1 = p 2 = 1 ⁄ 2 , entonces se podría usar una variable aleatoria x de 32 bits para hacer 32 elecciones, pero el método de alias solo generará una.
Otro caso surge cuando las probabilidades están fuertemente desequilibradas, por lo que U i ≈ 0 . Por ejemplo, si p 1 = 0,999 y p 2 = 0,001 , entonces la gran mayoría de las veces, solo se requieren unos pocos bits aleatorios para determinar que se aplica el caso 1. En tales casos, el método de tabla descrito por Marsaglia et al. [5] : 1–4 es más eficiente. Si hacemos muchas elecciones con la misma probabilidad, en promedio podemos requerir mucho menos de un bit aleatorio insesgado. Usando técnicas de codificación aritmética aritmética podemos acercarnos al límite dado por la función de entropía binaria .