Estou trabalhando em um algoritmo que precisa calcular o tamanho de um conjunto gerado pelas interseções de pelo menos 2 conjuntos. Mais especificamente:
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:
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
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:
ORDER BY RAND()
, o que não é perfeito, mas deve ser adequado para esta tarefa.Respostas:
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 0A0 A0
fonte
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 ):A0
factor
z
factor
fonte