Estimando el tamaño de una intersección de conjuntos múltiples usando una muestra de un conjunto

10

Estoy trabajando en un algoritmo que necesita calcular el tamaño de un conjunto generado por las intersecciones de al menos 2 conjuntos. Más específicamente:

z=|A0An|

Los conjuntos que se entrecruzan son generados por consultas SQL, y en un esfuerzo por mantener las cosas rápidas, obtengo un recuento de cada consulta con anticipación, luego tomo el conjunto con el recuento más bajo ( ) y uso esas ID como límites en el resto de las grandes consultas, por lo que la intersección se convierte efectivamente:A0

z=|(A0A1)(A0An)|

Incluso esta estrategia me deja con algunas consultas bastante grandes para ejecutar, ya queA veces puede ser grande. Mi idea para lidiar con eso es tomar una muestra aleatoria de e intersecarla con el resto de los conjuntos antes de extrapolar nuevamente a una estimación adecuada de . Mi pregunta es: ¿cuál es la mejor manera de tomar muestras y luego extrapolar para volver a un valor de que, si no es del todo exacto, tiene un rango de error predecible?|A0|A0zz


Esto es lo que he probado hasta ahora (en pseudocódigo, más o menos):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

Este código funciona, pero parece sobreestimar constantemente z, con un tamaño de muestra más bajo que produce una estimación más alta. Además, no estoy seguro de cómo esto se escalaría con más de dos conjuntos para cruzarse.

Espero que esta pregunta tenga sentido, avíseme si puedo aclarar algo más. Además, si esta pregunta está fuera de tema o pertenece a otro lugar, por favor avíseme y me complace moverla.


Según el comentario de Bill , realicé algunas pruebas rápidas para mostrar el tamaño de la muestra frente al error. Cada segmento de tamaño de muestra se ejecutó 20 veces y, como puede ver, hay una tendencia bastante clara:

Trama

Jimmy Sawczuk
fuente
Creo que un muestreo aleatorio simple sin reemplazo debería funcionar. Estoy desconcertado de que te sobreestimes. Parece que se mapea exactamente para estimar una media poblacional usando la media muestral de una muestra aleatoria. Está tratando de estimar la probabilidad de población de que un elemento de esté en la intersección de las otras s. He señalado con un ejemplo simple, y funciona bien. ¿Qué tan seguro está de que constantemente está sobreestimando? ¿Ha sucedido 15 veces de 20 o 150 veces de 200? ¿La muestra es realmente aleatoria? UNA0 0UNA
Bill
1
@Bill agregué un gráfico de tamaño de muestra vs. error que ilustra lo que estoy viendo. Es más de 20 veces de 20. En cuanto a la muestra aleatoria, es tan aleatoria como ORDER BY RAND(), lo que no es perfecto, pero debería ser adecuado para esta tarea.
Jimmy Sawczuk
@JimmySawczuk ¿No sería mejor simplemente intersectar el "conjunto de trabajo" con "a" directamente, en lugar de "intersectar (A0, a)"? Debido a que "A0" probablemente será más grande que el "conjunto de trabajo" actual en el algoritmo después de la primera ejecución ... ¿Lo entiendo correctamente?
¿Puede confirmar que realmente quiere decir conjuntos y no multisets (es decir, que no hay duplicados en los conjuntos)? Porque, si los hay, es fácil sobreestimar el tamaño de la "intersección" por su método. (Considere el caso en el que es solo 100 copias del mismo elemento y usted tomó muestras de la mitad de ellas.)UNA0 0
Innuo
¿También puedo preguntar si el tamaño de la intersección, en relación con el tamaño de los conjuntos originales, es extremadamente pequeño? Si es así, siento que eso explicaría tu problema. He realizado algunas simulaciones (con conjuntos más pequeños) y también estoy obteniendo una sobreestimación bastante consistente, aunque pequeña.

Respuestas:

3

Si su conjunto tiene elementos repetidos (es decir, en realidad es un conjunto ), el procedimiento sobreestimará el tamaño de la intersección porque su factor de escala utiliza el número de elementos muestreados y no el número de "tipos" únicos muestreados. Puede corregir la estimación calculando el factor como la relación entre el número de elementos únicos en su muestra aleatoria y el número de elementos únicos en el conjunto completo .UNA0 0UNA0 0

Innuo
fuente
0

UNA0 0factorzfactor

Trama

Jimmy Sawczuk
fuente