Estimando o tamanho de uma interseção de vários conjuntos usando uma amostra de um conjunto

10

Estou trabalhando em um algoritmo que precisa calcular o tamanho de um conjunto gerado pelas interseções de pelo menos 2 conjuntos. Mais especificamente:

z=|A0An|

Os conjuntos que são cruzados são gerados por consultas SQL e, em um esforço para manter as coisas rápidas, recebo uma contagem de cada consulta com antecedência, depois pego o conjunto com a contagem mais baixa ( ) e utilizo esses IDs como limites no restante das grandes consultas, para que a interseção se torne efetivamente:A0

z=|(A0A1)(A0An)|

Até essa estratégia me deixa com algumas consultas muito grandes para executar, poisàs vezes pode ser grande. Minha idéia para lidar com isso é pegar uma amostra aleatória de e -la com o restante dos conjuntos antes de extrapolar para uma estimativa adequada de . Minha pergunta é: qual é a melhor maneira de realizar amostragem e extrapolar para retornar a um valor de que, se não for totalmente preciso, tem um intervalo de erro previsível?A 0 z z|A0|A0zz


Aqui está o que eu tentei até agora (em pseudocódigo, mais ou 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)

Esse código funciona, mas parece superestimar consistentemente z, com um tamanho de amostra menor produzindo uma estimativa mais alta. Além disso, não tenho certeza de como isso seria dimensionado com mais de dois conjuntos para interseção.

Espero que essa pergunta faça sentido, deixe-me saber se posso esclarecer mais alguma coisa. Além disso, se esta questão estiver fora do tópico ou pertencer a outro lugar, entre em contato. Fico feliz em movê-la.


Pelo comentário de Bill , fiz alguns testes rápidos para mostrar o tamanho da amostra versus o erro. Cada balde de tamanho de amostra foi executado 20 vezes e, como você pode ver, há uma tendência bastante clara:

Enredo

Jimmy Sawczuk
fonte
Acho que a amostragem aleatória simples sem substituição deve funcionar. Estou confuso que você esteja superestimando. Parece que ele mapeia exatamente para estimar uma média populacional usando a média amostral de uma amostra aleatória. Você está tentando estimar a probabilidade da população de que um elemento de esteja na interseção dos outros . Eu citei um exemplo simples e funciona bem. Você tem certeza de que está superestimando constantemente? Aconteceu 15 vezes em 20 ou 150 em 200? A amostra é realmente aleatória? AA0A
Bill
11
@ Bill Adicionei um gráfico de tamanho de amostra vs. erro que ilustra o que estou vendo. É mais do que 20 vezes em 20. Quanto à amostra aleatória, é tão aleatória quanto ORDER BY RAND(), o que não é perfeito, mas deve ser adequado para esta tarefa.
Jimmy Sawczuk
@JimmySawczuk Não seria melhor simplesmente cruzar o "conjunto de trabalho" com "a" diretamente, em vez de "cruzar (A0, a)"? Como "A0" presumivelmente será maior que o atual "conjunto de trabalho" no algoritmo após a primeira execução ... Estou entendendo isso corretamente?
Você pode confirmar que realmente quer dizer conjuntos e não conjuntos múltiplos (ou seja, que não há duplicatas nos conjuntos)? Porque, se houver, é fácil superestimar o tamanho da "interseção" pelo seu método. (Considere o caso onde é um apenas 100 cópias do mesmo elemento e você amostrados metade deles.)A0
Innuo
Também posso perguntar se o tamanho da interseção, em relação ao tamanho dos conjuntos originais, é extremamente pequeno? Nesse caso, acho que isso explicaria seu problema. Fiz algumas simulações (com conjuntos menores) e também estou obtendo uma superestimação bastante consistente, embora pequena.

Respostas:

3

Se o seu conjunto tiver elementos repetidos (ou seja, é realmente um conjunto ), o tamanho da interseção será superestimado pelo seu procedimento porque seu fator de escala usa o número de elementos amostrados e não o número de "tipos" únicos amostrados. Você pode corrigir a estimativa calculando o fator como a razão entre o número de elementos exclusivos em sua amostra aleatória e o número de elementos exclusivos no conjunto completo .A 0A0A0

Innuo
fonte
0

Como Innuo aponta , meu problema era por causa de duplicatas no conjunto de amostras , o que fazia com que meu pseudocódigo fosse baixo, o que por sua vez fazia com que a extrapolação final fosse muito alta porque era gerada pelo inverso de . A remoção de duplicatas resolveu esse problema e agora o algoritmo gera um gráfico delta vs. tamanho da amostra mais do que eu esperaria (as linhas indicam a margem de erro em um nível de confiança de 95% para esse tamanho de amostra em relação à população total ):A0factorzfactor

Enredo

Jimmy Sawczuk
fonte