Para recuperar k números aleatorios de una matriz de tamaño indeterminado utilizamos una técnica llamada muestreo de yacimientos. ¿Alguien puede destacar brevemente cómo sucede con un código de muestra?Muestreo de yacimientos
Respuesta
En realidad no sabía que había un nombre para esto, así que probé e implementé esto desde cero:
import random
def random_subset(iterator, K):
result = []
N = 0
for item in iterator:
N += 1
if len(result) < K:
result.append(item)
else:
s = int(random.random() * N)
if s < K:
result[ s ] = item
return result
Con una prueba cerca del final.
@Larry: ¿Dónde está el 'aceptar con probabilidad s/k' en tu código? [cita del algoritmo mencionado en http://blogs.msdn.com/spt/archive/2008/02/05/reservoir-sampling.aspx] – Lazer
Por coincidencia, parece que entre ese artículo y el mío, usamos las mismas variables , pero para cosas diferentes Mi "K" parece ser su "S", y mi "N" (en el código) parece ser su "K". En otras palabras, acepto cosas con la probabilidad 'K/N', donde N es el conteo actual de cosas. – Larry
lo que quise preguntar es cómo estaba implementando la probabilidad en su código. De todos modos, ahora lo entiendo. ¡Gracias! – Lazer
Java
import java.util.Random;
public static void reservoir(String filename,String[] list)
{
File f = new File(filename);
BufferedReader b = new BufferedReader(new FileReader(f));
String l;
int c = 0, r;
Random g = new Random();
while((l = b.readLine()) != null)
{
if (c < list.length)
r = c++;
else
r = g.nextInt(++c);
if (r < list.length)
list[r] = l;
b.close();}
}
Esta pregunta ya tiene una respuesta aceptada de * years * ago ... – alestanis
Siguiendo (1981) Descripción de Knuth más de cerca, embalse de muestreo (algoritmo R) podría implementarse de la siguiente manera:
import random
def sample(iterable, n):
"""
Returns @param n random items from @param iterable.
"""
reservoir = []
for t, item in enumerate(iterable):
if t < n:
reservoir.append(item)
else:
m = random.randint(0,t)
if m < n:
reservoir[m] = item
return reservoir
¿Cuál es la diferencia entre esto y [la respuesta aceptada] (http://stackoverflow.com/a/2612822/481584)? Creo que esto es exactamente lo mismo, incluso si este código es más elegante. –
Puede estar directamente relacionado con la investigación publicada ([Knuth, 1981] (https://github.com/djtrack16/thyme/blob/master/computer%20science/Donald.E.Knuth.The.Art.of.Computer. Programming.Volume.2.pdf)), en caso de que alguien esté interesado en una explicación más extensa o la prueba de Knuth. – sam
- 1. Muestreo aleatorio de Mongo
- 2. Muestreo en visual vm
- 3. muestreo rápido en R
- 4. Algoritmo de muestreo sin reemplazo?
- 5. Muestreo de archivos de datos grandes
- 6. Seleccione muestreo aleatorio de sqlserver rápidamente
- 7. iOS: Unidades de audio: configuración de frecuencia de muestreo arbitraria
- 8. La frecuencia de muestreo de audio depende de los canales?
- 9. Frecuencia de muestreo para la grabación de audio del iPhone
- 10. secuencias de muestreo de números aleatorios en Haskell
- 11. Trazado de dos funciones con diferente frecuencia de muestreo
- 12. FFT/IFFT: Frecuencia de muestreo y duración de la señal
- 13. reutilización de números aleatorios en el muestreo depósito
- 14. muestreo de flotantes aleatorios en un rango en numpy
- 15. Diferencia entre muestreo y creación de perfiles en jVisualvm
- 16. python: muestreo sin reemplazo desde una cuadrícula 2D
- 17. Error '! Dat' tratando de establecer la frecuencia de muestreo (nula) de los dispositivos de audio
- 18. ¿Biblioteca para la conversión de datos de audio de frecuencia de muestreo?
- 19. iOS audio a través de HDMI: ¿cómo lidiar con la frecuencia de muestreo de 48khz?
- 20. Reducción/eliminación de recorte en SoX al convertir la frecuencia de muestreo
- 21. ¿Cómo obtener la frecuencia de muestreo y la frecuencia del archivo de música (MP3) en android?
- 22. Muestreo de permutaciones de [1, 2, 3, ..., N] para grande N
- 23. ¿Cómo hacer un mapa topográfico a partir de datos de muestreo dispersos?
- 24. Android: Mejore la tasa de muestreo del sensor mediante NDK y sondeo
- 25. ¿Algoritmo eficiente para el muestreo aleatorio de una distribución al tiempo que permite actualizaciones?
- 26. ¿Hay algún nombre para este algoritmo de muestreo utilizado en Minicraft?
- 27. ¿GDB es compatible con "muestreo de tiempo de ejecución" o hay una "extensión" de usuario que lo hace
- 28. Dado un archivo WAV, su tamaño de archivo y frecuencia de muestreo, ¿es posible calcular el recuento de muestras?
- 29. Convertir la frecuencia de muestreo sobre la marcha al leer un archivo WAV en una matriz de muestras con Java
- 30. Forma de inferir el tamaño de la base de usuarios de un sitio a partir del muestreo de los nombres de usuario tomados
pregunta relacionada http://stackoverflow.com/questions/54059/selection-a-set-of-random-elements-from-a-linked-list –
[Esta página] (http://blogs.msdn.com/spt/archive/2008/02/05/ reservoir-sampling.aspx) contiene una buena explicación con pseudo-código. (La página de Wikipedia a la que originalmente me vinculé no está clara, y el pseudocódigo está incompleto). –
Escribí una entrada de blog sobre el tema exacto hace un par de meses, que tiene una implementación de C#: http://gregbeech.com/ blog/sampling-very-large-sequences La mejor descripción de cómo funciona que he encontrado está aquí: http://gregable.com/2007/10/reservoir-sampling.html –