73
Estruturas de Dados probabilísticas Você não precisa saber tudo Diego Rocha

Estruturas de dados probabilísticas você não precisa saber tudo

Embed Size (px)

Citation preview

Estruturas de Dados probabilísticasVocê não precisa saber tudo

Diego Rocha

@kiwi

@kiwi - Desafios100M+ de eventos/dia

Tempo real Baixo custo

Abordagem convencional

(Not so) old dog,new tricks

Estruturas de dados probabilísticas

Estruturas de dados probabilísticas

Precisam de pouca memória

Estruturas de dados probabilísticas

Precisam de pouca memória

Tempo de acesso é constante

Estruturas de dados probabilísticas

Precisam de pouca memória

Tempo de acesso é constanteCompletamente cool

- membership test- Código promocional já foi utilizado?- Usuário já realizou uma ação?

- Cardinality estimation- Quantas pessoas diferentes já assistiram a um vídeo?

- Frequency estimation- Quais são as tags mais utilizadas em comentários?

Para que serve?

Quantas pessoas diferentes que leram a notícia principal publicaram comentários com a tag mais frequente?

Get crazy!

Cardinality estimationMembership testFrequency estimation

Linear Probabilistic Counter

Linear Probabilistic CounterBloom Filter

Linear Probabilistic CounterBloom Filter

Count-min sketch

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

Vamos rever alguns conceitos

- Bitset- Função hash

Antes de mais nada...

Sequência de bits, cada um com sua posiçãoBitset

Sequência de bits, cada um com sua posiçãoBitset

0 1 0 0 1 0 1 0 1 1 0 00 1 2 3 4 5 6 7 8 9 10 11

Bitset0 1 0 0 1 0 0 1 1 1 0 1OR =

0 1 1 0 0 1 0 1 0 1 0 0AND =

0 1 0 0 0 1 1 0 0 0 1 0XOR =

Função determinística, sobrejetora, com domínio de tamanho arbitrário e contradomínio finito

Função hash

Função determinística, sobrejetora, com domínio de tamanho arbitrário e contradomínio finito

Função hash

Waat?

Função hashJoão

RenatoTeresa

DeniseFábio

4

158

2316

...

42EliLuana

Hash

Função hashJoão

RenatoTeresa

DeniseFábio

4

158

2316

...

42EliLuana

Hash

Colisão!!

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

Linear Probabilistic CounterEstrutura de dados que permite realizar:

- membership test- cardinality estimation

Linear Probabilistic CounterBitset de tamanho m, com todas as posições inicialmente zeradas

0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Adicionamos “joão”

hash(João) => 3

hash(João) => 3

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Adicionamos “Teresa”hash(Teresa) => 10

hash(João) => 3

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Adicionamos “Renato”hash(Teresa) => 10hash(Renato) => 3

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Membership test: “Luana já foi inserida?”

hash(Luana) => 7

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Membership test: “Luana já foi inserida?”

hash(Luana) => 7Nops

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Membership test: “Eli já foi inserido?”

hash(Eli) => 10

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Membership test: “Eli já foi inserido?”

hash(Eli) => 10Talvez

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Membership test: “Eli já foi inserido?”

hash(Eli) => 10Talvez

Falsos Positivos são possíveisTaxa de erro é definida pela taxa de colisão

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m = 12

Cardinality estimation: “Quantos nomes diferentes foram inseridos?”

Linear Probabilistic Counter

0 0 0 1 0 0 0 0 0 0 1 00 1 2 3 4 5 6 7 8 9 10 11

m (tamanho do bitset) = 12

Cardinality estimation: “Quantos nomes diferentes foram inseridos?”

card(m, w) = -m ln m - wm

w (nº de bits 1) = 2

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

Bloom filterEstrutura de dados muito parecida com o linear probabilistic counter que permite realizar Membership test

0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

Bloom filterCada inserção marca k bits, ao invés de um único

0 0 0 0 0 0 0 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

Bloom filterCada inserção marca k bits, ao invés de um único

0 0 0 1 0 1 1 0 0 0 0 00 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(João) => [3, 5, 6]

Bloom filterCada inserção marca k bits, ao invés de um único

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Renato) => [5, 10, 11]

Bloom filterMEmbership test: “Luiz já foi inserido?”

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Luiz) => [3, 4, 6]

Bloom filterMEmbership test: “Luiz já foi inserido?”

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Luiz) => [3, 4, 6]Nah

Bloom filterMEmbership test: “Luana já foi inserida?”

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Luana) => [6, 10, 11]

Bloom filterMEmbership test: “Luana já foi inserida?”

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Luana) => [6, 10, 11]

Provavelmente

Bloom filterMEmbership test: “Luana já foi inserida?”

0 0 0 1 0 1 1 0 0 0 1 10 1 2 3 4 5 6 7 8 9 10 11

m = 12; k = 3

hash(Luana) => [6, 10, 11]

Provavelmente

Também pode apresentar falso positivos, mas geralmente são mais raros

Linear Probabilistic Counters são Bloom Filters com k = 1

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

Count-min sketchEstrutura de dados utilizada para realizar frequency estimation

Count-min sketchComeçamos com uma matriz mxn de inteiros

0 0 0 0

0 0 0 00 0 0 0

0 0 0 0

Count-min sketchPara cada elemento observado, incrementamos n posições

0 0 1 0

0 0 0 11 0 0 0

0 1 0 0

hash(João) => [2, 0, 1, 3]

Count-min sketchPara cada elemento observado, incrementamos n posições

1 0 2 0

0 0 0 11 1 0 1

0 1 0 0

hash(Eli) => [1, 2, 1, 2]

Count-min sketchEventualmente...

11 0 2 5

7 6 4 54 6 15 13

9 19 10 8

Count-min sketch… obtemos uma estimativa da frequência de um elemento, observando a menor contagem para aquele elemento

hash(João) => [2, 0, 1, 3]11 0 2 5

7 6 4 54 6 15 13

9 19 10 8

Count-min sketchA estimativa sempre será maior ou igual à frequência real

11 0 2 5

7 6 4 54 6 15 13

9 19 10 8

hash(João) => [2, 0, 1, 3]

Count-min sketchA estimativa sempre será maior ou igual à frequência real

11 0 2 5

7 6 4 54 6 15 13

9 19 10 8

hash(João) => [2, 0, 1, 3]

Tende a ser melhor quando alguns elementos são muito mais frequentes que outros

Linear Probabilistic CounterBloom Filter

LogLog Counter

Count-min sketch

LogLog CounterFornece cardinality estimation utilizando muuuuito pouca memória e com boa precisão para conjuntos com muitos elementos

LogLog CounterBAseia-se na ideia de que, sabendo qual foi o elemento mais raro encontrado, é possível obter uma estimativa de quantos elementos foram vistos

LogLog CounterRank(X) - “raridade do elemento”

LogLog CounterRank(X) - “raridade do elemento”Rank de binários

1111111111111110...

01111111...

00111111...

00000001

1

2

3

8

Raridade definida pelo número zeros iniciaisn/(2^K) elementos começando com k - 1 zeros

LogLog CounterEstimativa instável:

card(k) = 2^k

k = maior rank encontrado

LogLog CounterEstimativa instável:

card(k) = 2^k

k = maior rank encontrado

Podemos obter uma estimativa precisa realizando uma média entre várias estimativas instáveis

LogLog CounterBucketsCada bucket armazena o maior rank observado dentro de um conjunto de valores

0

00

0

0

01234

LogLog Counter

0

20

0

0

01234

hash(João) => 3

Rank(João) => 2

LogLog Counter

4

20

0

0

01234

hash(Luana) => 1

Rank(Luana) => 4

LogLog Counter

4

20

0

0

01234

hash(Eli) => 3

Rank(eli) => 1

LogLog CounterEstimativa precisa:

card(m, buckets) = αm.m.2^(∑buckets[j] / m)

m = número de buckets

αm =

j

Γ(−1/m) 1−2 -m

log 2

1/m

( ) ~~ 0.39701

LogLog CounterEstimativa precisa:

card(m, buckets) = αm.m.2^(∑buckets[j] / m)

m = número de buckets

αm =

j

Γ(−1/m) 1−2 -m

log 2

1/m

( ) ~~ 0.39701

Crazy math totally worth it

Outras estruturas de dadosStream summary

dezenas de variações de bloom filter

Count-mean-min sketch

HyperLogLog Counter

Referências- Loglog Counting of Large Cardinalities - Marianne Durand , Philippe Flajolet 2003- Space/time trade-offs in hash coding with allowable errors - Burton H. Bloom 1970- A Linear-Time Probabilistic Counting Algorithm for Database Applications - KYU-

YOUNG WHANG , HOWARD M. TAYLOR 1990- Count-Min Sketch - Graham Cormode 2003- PROBABILISTIC DATA STRUCTURES FOR WEB ANALYTICS AND DATA MINING (https:

//highlyscalable.wordpress.com/2012/05/01/probabilistic-structures-web-analytics-data-mining/) - Ilya Katsov

perguntas?