Stima della dimensione di un'intersezione di più insiemi utilizzando un campione di un insieme


10

Sto lavorando a un algoritmo che deve calcolare la dimensione di un set generato dalle intersezioni di almeno 2 set. Più specificamente:

z=|A0An|

Gli insiemi che si intersecano sono generati da query SQL e, nel tentativo di mantenere le cose velocemente, ottengo un conteggio di ogni query in anticipo, quindi prendo l'insieme con il conteggio più basso ( ) e uso quegli ID come limiti su il resto delle grandi query, quindi l'intersezione diventa effettivamente:A0

z=|(A0A1)(A0An)|

Anche questa strategia mi lascia con alcune domande piuttosto grandi da eseguire, poiché a volte può essere grande. La mia idea per affrontare questo è prendere un campione casuale di A 0 e intersecarlo con il resto degli insiemi prima di estrapolare di nuovo una stima corretta di z . La mia domanda è: qual è il modo migliore per eseguire il campionamento e quindi l'estrapolazione per tornare a un valore di z che, se non del tutto accurato, ha un intervallo di errori prevedibile?|A0|A0zz


Ecco cosa ho provato finora (in pseudocodice, una sorta di):

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)

Questo codice funziona, ma sembra sopravvalutare costantemente z, con una dimensione del campione inferiore che produce una stima più elevata. Inoltre, non sono sicuro di come questo si ridimensionerebbe con più di due set da intersecare.

Spero che questa domanda abbia un senso, fammi sapere se posso chiarire qualcosa di più. Inoltre, se questa domanda è fuori tema o appartiene a qualche altra parte, per favore fatemi sapere e sono felice di spostarla.


Per il commento di Bill , ho eseguito alcune prove rapide per mostrare la dimensione del campione contro l'errore. Ogni bucket di dimensioni del campione è stato eseguito 20 volte e come puoi vedere c'è una tendenza abbastanza chiara:

Tracciare


A0A

1
@Bill Ho aggiunto un grafico delle dimensioni del campione contro l'errore che illustra ciò che sto vedendo. È più o meno 20 volte su 20. Per quanto riguarda il campione casuale, è tanto casuale quanto ORDER BY RAND(), il che non è perfetto ma dovrebbe essere adatto a questo compito.
Jimmy Sawczuk,

@JimmySawczuk Non sarebbe meglio intersecare semplicemente il "working set" con "a" direttamente, invece di "intersect (A0, a)"? Perché "A0" sarà presumibilmente più grande dell'attuale "working set" dell'algoritmo dopo la prima esecuzione ... Lo capisco correttamente?

A0

Inoltre, posso chiedere se la dimensione dell'intersezione, rispetto alla dimensione dei set originali, è estremamente ridotta? In tal caso, penso che ciò spiegherebbe il tuo problema. Ho eseguito alcune simulazioni (con set più piccoli) e sto anche ottenendo una sopravvalutazione abbastanza coerente, anche se piccola.

Risposte:



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.