Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

5 votos

¿Cómo elegir eficazmente n subconjunto de un conjunto de m muchos números, de manera uniforme al azar?

Problemas:

Es bastante simple: tenemos una lista de números de x1,x2,,xn,,xm. Nuestro objetivo es al azar y de manera uniforme elegir un subconjunto de a n muchos números de estos.

Esto significa que, para cualquier i{1,2,,n,,m}, la probabilidad de elegir el valor de xi debe ser: n1m=nm

Un algoritmo:

Una instrucción es swap(xleft,xright). Es simplemente cambia sus valores. I. e.

  1. t:=xleft
  2. xleft:=xright
  3. xright:=t

Una propuesta de algoritmo: para cada una de las i{1,2,,n}, de forma aleatoria y uniformemente elegir algunos ki{1,2,,n,,m}, y, a continuación, ejecute swap(xi,xki). Luego regresar x1,x2,,xn como el conjunto de n-muchos de los números elegidos.

El reto:

Intuitivamente, que el algoritmo a mi me parece perfectamente bien. No veo absolutamente ningún problema en ello.

Pero cuando trato de mirar matemáticamente, no puedo probarlo. En lugar de eso, me parece realmente de demostrar que no es una solución correcta!

En primer lugar, echemos un vistazo a la probabilidad de elegir la primera de las n números:

Para cualquier i{1,2,,n}, xi puede ser elegido si:

  • xi existe en la mano derecha de swap. Hay exactamente n de los casos, incluyendo el caso al xi existe en tanto, la izquierda y la mano derecha.
  • xi existe en la mano izquierda, de tal manera que no existe xj en la mano derecha tal que j{1,2,,n}. Hay exactamente n tales casos, uno de los cuales es el caso cuando se i=j que hemos contado anteriormente. Por lo tanto, para evitar el recuento de los casos de i=j dos veces, suponemos que no se n1 de los casos.

No hay ningún otro caso en que xi es elegido. Por lo tanto, la probabilidad de elegir un número xi, dado que el i{1,2,,n} es: n+(n1)m2

Ahora, echemos un vistazo a la probabilidad de elegir el restablecimiento de los números hasta el m:

Para cualquier i{n+1,n+2,,m}, xi puede ser elegido si:

  • xi existe en la mano derecha, de tal manera que no existe xj en la mano derecha tal que j{1,2,,n}. Hay exactamente n de esos casos.

No hay ningún otro caso de tener xi elegido. Así que la probabilidad de elegir a xi es: nm2

La comparación de las probabilidades:

Que dice que hay un sesgo. La probabilidad de elegir el 1 n números es mayor que la probabilidad de elegir el restablecimiento de los números hasta el mth

Mi pregunta:

¿De dónde me salen mal? Cómo abordar este problema?

6voto

jldugger Puntos 7490

La "propuesta de algoritmo" es incorrecta. Una forma de ver por qué esto es así es contar el número de equiprobables permutaciones realizadas por el algoritmo. A cada paso hay m posibles valores de k, de donde después de n hay mn resultados posibles. Aunque muchos de los resultados será duplicada, el punto es que la probabilidad de salida de cualquier permutación debe ser un múltiplo de mn. Sin embargo, la probabilidad correcta, 1/m!, rara vez es un múltiple. Por ejemplo, con m=3 n=2 se producirá 32=9 permutaciones posibles, cada uno con probabilidad de 1/9, pero sólo hay m!=6 distintas permutaciones. Desde 1/6 no es un múltiplo de a 1/9, ninguna de las permutaciones será producido con una probabilidad de 1/6.

Hay mejores maneras. Uno es el "Algoritmo P" de Knuth del Seminumerical Algoritmos, la sección 3.4.2:

for i := 1 to n do
    Swap(x[i], x[RandInt(i,m)])

La prueba de que esto funciona es por inducción sobre m.

  1. Obviamente funciona en el caso base (m=0 o m=1, como usted prefiera).

  2. En el primer paso, en cada xk tiene una posibilidad igual de ser trasladado a la primera posición. El algoritmo procede a trabajar de forma recursiva y de forma independiente en los elementos en las posiciones de 2 a través de n, donde por la hipótesis inductiva cada uno de esos elementos tiene una igual e independiente probabilidad de aparecer en cualquier lugar entre la primera n1 posiciones. En consecuencia, todos los m de los elementos de x condiciones de igualdad e independiente posibilidades de aparecer entre los primeros a n posiciones cuando el algoritmo termina, QED.

El Algoritmo de Knuth S garantiza la salida será en el orden en que aparecieron originalmente en x:

Select := n
Remaining := m
for i := 1 to m do
    if RandReal(0,1) * Remaining < Select then
        output x[i]
        Select--
    Remaining--

Ejercicios (2), (3) y (4) en la sección pregunte el lector demostrar que este algoritmo funciona. Una vez más, la prueba es una inducción en m.

  1. Cuando m=n=1, x siempre es devuelto.

  2. De lo contrario, x1 será la salida con una probabilidad de n/m en el primer paso, que es la probabilidad correcta, y el algoritmo funciona de forma recursiva a la salida de n1 elementos de x1=(x2,x3,,xm) ordenados si x1 estaba de salida y otra de salida será de n elementos de x1 ordenados, QED.


Si te gustaría seguir a lo largo de, aquí es una versión ejecutable en R, junto con una rápida simulación para verificar que todos los elementos de a x tienen iguales posibilidades de ser incluidos.

algorithm.S <- function(x, n=1) {
  m <- length(x)
  #
  # Check input.
  #
  if (n < 0 || n > m) stop("Subset size out of range.")
  #
  # Handle special cases that R has trouble with.
  #
  if (m <= 1) 
    if (n==0) return (x[c()]) else return(x)
  #
  # The algorithm.
  #
  y <- x[1:n]
  select <- n
  remaining <- m
  j <- 0
  for (i in 1:m) {
    if (runif(1) * remaining < select) {
      j <- j+1; y[j] <- i
      select <- select-1
    }
    remaining <- remaining-1
  }
  return(y)
}

x <- 1:10
sim <- replicate(1e4, algorithm.S(x, 4))
hist(sim, breaks=seq(min(x)-1/2, max(x)+1/2, by=1))

enter image description here

1voto

mdewey Puntos 579

Empezar por el principio de la lista.

Elegir el elemento con probabilidad igual a nm. Si es elegido set n=n1. Conjunto de m=m1 ahora pasar al elemento siguiente y repita hasta que sea n m es cero.

No probado en detalle, pero debería funcionar.

O utilizar las instalaciones de su software estadístico favorito.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X