Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Вероятностные структуры данных

783 views

Published on

Рассмотрены примеры простейших вероятностных структур данных: Bloom Filter, Count Min Sketch, Linear Counting, MinHash

Published in: Data & Analytics
  • http://www.slideshare.net/gakhov/probabilistic-data-structures-part-2-cardinality
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Да Дима, она просто не попала в русскую презентацию. Конечно, LinearCоunting имеет смысл для очень маленьких мощностей, а для множеств с миллионами элементов используется HyperLogLog (например, в Redis) или HyperLogLog++ (например, в  Elasticsearch)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Странно, что в cardinality problem не была рассказана структура HyperLogLog. Она не сложнее устроена, но работает лучше, и, насколько я знаю, именно она применяется в большинсве приложений сегодня.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Вероятностные структуры данных

  1. 1. ferret go GmbH, Berlin Dr.Andrii Gakhov ВЕРОЯТНОСТНЫЕ СТРУКТУРЫ ДАННЫХ И ИХ ПРИМЕНЕНИЕ
  2. 2. MEMBERSHIP Содержание: ▸ Bloom Filter
  3. 3. • Определить принадлежность элемента к множеству с большим числом элементов THE PROBLEM
  4. 4. BLOOM FILTER
  5. 5. BLOOM FILTER • предложил Burton Howard Bloom, 1970 • Bloom filter это реализация вероятностного множества с 3 операциями: • добавить элемент в множество • проверить, что элемент принадлежит множеству • проверить, что элемент не принадлежит множеству • Bloom filter описывается 2 параметрами: • m - длина фильтра 
 (пропорциональна ожидаемому числу элементов n) • k - число различных хэш-функций
 (k намного меньше, чем m) • Bloom filter не хранит сами элементы и требует только 1 byte на единицу сохраненных данных
  6. 6. BLOOM FILTER: ALGORITHM • Bloom filter представляет собой bit array длиной m bits, все элементы которого равны 0 в самом начале • Добавление элемента - вычислить значения всех k хэш- функций для данного элемента и установить биты с соответствующими индексами • Проверка принадлежности элемента - вычислить значения всех k хэш-функций для данного элемента и проверить биты с соответствующими индексами: • если все биты установлены, тогда ответ “может быть” • если хотя бы 1 бит установлен, тогда ответ “точно нет” • Время, необходимое для добавления элемента или его проверки, является постоянным O(k) и не зависит от количества элементов множества
  7. 7. BLOOM FILTER: EXAMPLE • Рассмотрим Bloom filter длиной 16 bits (m=16) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 • Рассмотрим 2 хэш-функции (k=2): 
 MurmurHash3 и Fowler-Noll-Vo
 (соответствующие индексы вычисляются как mod 16) • Добавим элемент в фильтр: “ferret”:
 MurmurHash3(“ferret”) = 1, FNV(“ferret”) = 11 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
  8. 8. BLOOM FILTER: EXAMPLE • Добавим элемент в фильтр: “bernau”:
 MurmurHash3(“bernau”) = 4, FNV(“bernau”) = 4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 • Проверим принадлежности элемента: “berlin”:
 MurmurHash3(“berlin”) = 4, FNV(“berlin”) = 12
 Bit 12 не установлен, следовательно “berlin” точно не принадлежит множеству • Проверим принадлежности элемента: “paris”:
 MurmurHash3(“paris”) = 11, FNV(“paris”) = 4
 Bits 4 и 11, следовательно элемент наверное принадлежит множеству (false positive)
  9. 9. BLOOM FILTER: PROPERTIES • Возможны ложно-позитивные срабатывания
 (false positive - элемент не в множестве, но все биты установлены) • Ложно-негативные срабатывания не возможны • Хэш-функции должны быть независимые и равномерно распределенные. • Хэш-функции должны быть быстрыми в вычислении
 (не стоит использовать криптографические хэш-функции, как sha1) • При помощи выбора k и m можно уменьшить вероятность ложно-позитивного срабатывания. P e ∈ℑ| e ∉ℑ( ) ≈ 1− e kn m ⎛ ⎝⎜ ⎞ ⎠⎟ k P e ∉ℑ| e ∈ℑ( )= 0 k∗ = m n ln2
  10. 10. BLOOM FILTER: APPLICATIONS • Google BigTable, Apache HBase и Apache Cassandra используют Bloom filters для уменьшения операций проверки диска для несуществующих строк и столбцов • Medium использует Bloom filters, чтобы рекомендовать статьи, которые читатель ранее не читал • Google Chrome web browser использовал Bloom filter для проверки URL по базе известных вредоносных сайтов (заменено на PrefixSet, Issue 71832) • Squid Web Proxy Cache исползует Bloom filters для управления кешированием
  11. 11. BLOOM FILTER: PROBLEMS • Классический Bloom filter не поддерживает операцию удаления. • Bloom filters работаю хорошо, пока они помещаются в память • ~1 byte на элемент (3x-4x больше для Counting Bloom filters, поддерживающих удаление) • Что происходит когда Bloom filters не помещаются в память? • На обычных магнитных дисках Bloom filters умирают. Обычный диск поддерживает только 100–200 (random) I/Os в секунду, а каждая операция с Bloom filter требует множество I/Os. • На SSD дисках Bloom filters менее производительны - в 10000 раз медленнее, чем в памяти. • Буферизация может помочь, но возникают проблемы из-за масштабирования, уменьшающие эффект буфферизации.
  12. 12. BLOOM FILTER: VARIANTS • Attenuated Bloom filters используют массивы фильтров для вычисления кратчайших путей • Spectral Bloom filters используются для оценки частот элементов. • Counting Bloom Filters являются раширением классического варианта, поддерживающим операцию удаления. Вместо одного бита, они используют счетчик элементов, который увеличивается при кадой операции добавления и уменьшается при удалении. • Compressed Bloom filters предназначены для оптимизации размера фильтра при сохранении приемлемой вероятности ошибки. • Bloom Filter Cascade реализуют фильтрацию через каскад из Bloom filters. • Scalable Bloom Filters могут динамически адаптироваться к количеству сохраненных элементов, поддерживая требуемую оценку вероятности ошибки.
  13. 13. BLOOM FILTER: PYTHON • https://github.com/jaybaird/python-bloomfilter
 pybloom is a module that includes a Bloom Filter data structure along with an implementation of Scalable Bloom Filters • https://github.com/seomoz/pyreBloom
 pyreBloom provides Redis backed Bloom Filter using GETBIT and SETBIT
  14. 14. BLOOM FILTER: READ MORE • http://dmod.eu/deca/ft_gateway.cfm.pdf • https://en.wikipedia.org/wiki/Bloom_filter • https://www.cs.uchicago.edu/~matei/PAPERS/bf.doc • http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf • https://www.eecs.harvard.edu/~michaelm/postscripts/ im2005b.pdf
  15. 15. FREQUENCY Содержание: ▸ Count-Min Sketch
  16. 16. • Определить частоту элемента в множестве THE PROBLEM
  17. 17. COUNT-MIN SKETCH
  18. 18. COUNT-MIN SKETCH • предложен G. Cormode, S. Muthukrishnan в 2003 • CM Sketch это сублинейная пространственная структура данных, поддерживающая 2 операции: • добавление элемента • подсчет сколько раз элемент был добавлен (частота) • Count-Min Sketch описывается 2 параметрами: • m - число “ячеек” 
 (независимо от n, но намного меньше) • k - число различных хэш-функций со значениям 1…m
 (k намного меньше m) • CM Sketch занимает ограниченно пространство: m*k счетчиков и k хэш-функций
  19. 19. COUNT-MIN SKETCH: ALGORITHM • Count-Min Sketch это просто матрица из счетчиков (все равны 0), где каждая строка соответсвует определенней хэш-функции hi, i=1…k • Добавление элемента - вычислить значения всех k хэш-функций и увеличить счетчики на позициях [i, hi(element)], i=1…k • Вычисление частоты элемента - вычислить значения всех k хэш- функций и вернуть минимальное из значений счетчиков на позициях [i, hi(element)], i=1…k. • ВАЖНО: Из-за возможных коллизий (soft collisions) мы имеем k (разных) оценок настоящей частоты элемента, но т.к. мы никогда не уменьшаем счетчик, эти оценки могут быть только больше или равны частоте. • Время добавления или вычисления частоты элемента фиксировано O(k) при условии, что все хэш-функции могут быть вычислены на постоянное время.
  20. 20. COUNT-MIN SKETCH: EXAMPLE • Рассмотрим CM Sketch с 16 столбцами (m=16) • Рассмотрим 2 хэш-функции(k=2):
 h1 - MurmurHash3 и h2 - Fowler-Noll-Vo
 (соответствующие индексы вычисляются как mod 16) • Добавим элемент: “berlin”
 h1(“berlin”) = 4, h2(“berlin”) = 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 01 2 0
  21. 21. COUNT-MIN SKETCH: EXAMPLE • Добавим элемент “berlin”еще 5 раз: • Добавим элемент “bernau”: h1(“bernau”) = 4, h2(“bernau”) = 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 01 2 0 • Добавим элемент “paris”: h1(“paris”) = 11, h2(“paris”) = 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 01 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01 2 0
  22. 22. COUNT-MIN SKETCH: EXAMPLE • Вычислим частоту: “london”:
 h1(“london”) = 7, h2(“london”) = 4
 freq(“london”) = min (0, 2) = 0 • Вычислим частоту: “berlin”:
 h1(“berlin”) = 4, h2(“berlin”) = 12
 freq(“berlin”) = min (7, 6) = 6 • Вычислим частоту: “warsaw”:
 h1(“warsaw”) = 4, h2(“warsaw”) = 12
 freq(“warsaw”) = min (7, 6) = 6 !!! due to hash collision 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 2 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 01 2 0
  23. 23. COUNT-MIN SKETCH: PROPERTIES • Count-Min Sketch возвращает только оценку сверху • Для достижения вероятности ошибки δ, необходимо выбрать k ≥ ln 1/δ. • для δ около 1%, k = 5 - достаточно • Count-Min Sketch фактически является такой же структурой как и Counting Bloom filter. 
 Разница задается только их назначением: • Count-Min Sketch имеет сублинейное число ячеек, в соответствии с выбранной точностью, но независимо от ожидаемого числа элементов в множестве • Counting Bloom filter имеет размер в зависимости от ожидаемого числа элементов в множестве.
  24. 24. COUNT-MIN SKETCH: APPLICATIONS • AT&T использует Count-Min Sketch в сетевых коммутаторах для анализа трафика в условиях ограниченной памяти • Google использует “count sketch” (предшественник count-min sketch) в своей инфраструктуре параллельного вычисления MapReduce • Реализован как часть библиотеки Algebird от Twitter
  25. 25. COUNT-MIN SKETCH: PYTHON • https://github.com/rafacarrascosa/countminsketch
 CountMinSketch is a minimalistic Count-min Sketch in pure Python • https://github.com/farsightsec/fsisketch
 FSI Sketch a disk-backed implementation of the Count- Min Sketch algorithm
  26. 26. COUNT-MIN SKETCH: READ MORE • http://dimacs.rutgers.edu/~graham/pubs/papers/cm- latin.pdf • http://dimacs.rutgers.edu/~graham/pubs/papers/ cmencyc.pdf • http://dimacs.rutgers.edu/~graham/pubs/papers/ cmsoft.pdf • http://theory.stanford.edu/~tim/s15/l/l2.pdf • http://www.cs.dartmouth.edu/~ac/Teach/CS49-Fall11/ Notes/lecnotes.pdf
  27. 27. CARDINALITY Содержание: ▸ Linear Counting
  28. 28. • Найти число различных элементов (мощность) в множестве с большим числом элементов THE PROBLEM
  29. 29. LINEAR COUNTING
  30. 30. LINEAR COUNTING: ALGORITHM • Линейный счетчик это битовый массив (хэш- таблица) размера m (все равны 0). • Алгоритм состоит из нескольких шагов: • для каждого элемента множества вычислить значение хэш-функции и установить соответствующий бит • вычислить долю V пустых битов в структуре
 (отношение числа пустых битов к размеру счетчика m ) • вычислить оценку мощности множества как
 n ≈ -m ln V
  31. 31. LINEAR COUNTING: EXAMPLE 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 • Рассмотрим 16-битный линейный счетчик (m=16) • Рассмотрим MurmurHash3 в качестве хэш-функции h
 (соответствующие индексы вычисляются как mod 16) • Добавим 10 элементов в множество: “bernau”, “bernau”, “bernau”, “berlin”, “kiev”, “kiev”, “new york”, “germany”, “ukraine”, “europe” (мощность данного множества n = 7) h(“bernau”) = 4, h(“berlin”) = 4, h(“kiev”) = 6, h(“new york”) = 6, h(“germany”) = 14, h(“ukraine”) = 7, h(“europe”) = 9 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0
  32. 32. LINEAR COUNTING: EXAMPLE число пустых битов: 11 m = 16 V = 11 / 16 = 0.6875 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 • Оценка мощности множества n ≈ - 16 * ln (0.6875) = 5.995
  33. 33. LINEAR COUNTING: READ MORE • http://dblab.kaist.ac.kr/Prof/pdf/Whang1990(linear).pdf • http://www.codeproject.com/Articles/569718/ CardinalityplusEstimationplusinplusLinearplusTimep
  34. 34. SIMILARITY Agenda: ▸ MinHash
  35. 35. • Найти похожие множества (документы) в коллекции THE PROBLEM
  36. 36. MINHASH
  37. 37. SIMILARITY • Как правило, в задачах информационного поиска (Information Retrival, IR) возникает необходимость оценки подобия документов • Документ может быть представлен набором своих слов (“bag of words”) и рассматриваться как множество элементов некоего универсального множества слов, составляющих все документы коллекции • Jaccard similarity для двух множеств A и B: JS = A ∩ B A ∪ B
  38. 38. MINHASH: MATRIX REPRESENTATION • Коллекция множеств может быть представлена для наглядности как характеристическая матрица C. • Столбцы матрицы соответствуют множествам, а строки - элементам универсального множества всех элементов, из которых состоят множества • C(r, c) =1 если элемент в строке r принадлежит множеству в столбце c, иначе C(r,c) =0 • ВАЖНО: Характеристическая матрица не используется для непосредственного хранения данных - только для из представления. • Одной из причин этого - разреженность матрицы в большинстве случаев.
  39. 39. MINHASH: MATRIX REPRESENTATION • Рассмотрим коллекцию множеств (документов, представленные токенами): • S1 = {python, is, a, programming, language} • S2 = {java, is, a, programming, language} • S3 = {a, programming, language} • S4 = {python, is, a, snake} • Характеристическая матрица имеет вид: row S1 S2 S3 S4 a 0 1 1 1 1 is 1 1 1 0 1 java 2 0 1 0 0 language 3 1 1 1 0 programming 4 1 1 1 0 python 5 1 0 0 1 snake 6 0 0 0 1
  40. 40. MINHASH: INTUITION • Значение minhash для каждого столбца характеристической матрицы - значение индекса первой строки в перестановке, при которой в столбце стоит 1 • Для вычисления minhash для всей коллекции (представленной такими столбцами), необходимо выбрать перестановки строк. • Для большой характеристической матрицы это не достижимо за ограниченное время, т.к. приходится выбирать миллионы и миллиарды строк (это даже без учета сортировки). • Можно смоделировать эффект случайных перестановок, путем выбора случайных хэш-функций, которые отображают индексы строк в количество ячеек, равному количеству столбцов. • Вместо выбора n случайных перестановок столбцов, достаточно вычислить n случайно выбранных хэш-функций h1, h2, . . . , hn для индексов строк
  41. 41. MINHASH: ALGORITHM • Выбрать n хэш-функций h1, h2, . . . , hn • Для каждого множества из коллекции S (для каждого столбца), вычислить значение хэш-функций - вектор [h1(S), h1(S), . . . , h1(S)]. • Построить характеристическую матрицу C коллекции. • Построить матрицу сигнатур SIG, где SIG(i, c) соответсвует i й хэш- функции и столбцу c. Сначала все SIG(i, c) = ∞ для каждого i и c. • Для каждой строки r: • Вычислить h1(r), h2(r), . . . , hn(r) • Для каждого столбца c: • Если C(r,c) = 1, тогда SIG(i, c) = min{SIG(i,c), hi(r)} для i = 1..n • Оценить подобие между множествами используя финальную версию матрицы сигнатур
  42. 42. MINHASH: PROPERTIES • Связь между minhash и Jaccard similarity: • Вероятность того, что функция minhash для случайной перестановки строк вернет одинаковое значение для двух множеств равна значению Jaccard similarity этих множеств
  43. 43. MINHASH: EXAMPLE • Рассмотрим 2 хэш-функции: • h1(x) = x + 1 mod 7 • h2(x) = 3x + 1 mod 7 row S1 S2 S3 S4 h1(row) h2 (row) a 0 1 1 1 1 1 1 is 1 1 1 0 1 2 4 java 2 0 1 0 0 3 0 language 3 1 1 1 0 4 3 programming 4 1 1 1 0 5 6 python 5 1 0 0 1 6 2 snake 6 0 0 0 1 0 5 • Рассмотрим ту же самую коллекцию из 4 документов и 7 слов
  44. 44. MINHASH: EXAMPLE S1 S2 S3 S4 h1 ∞ ∞ ∞ ∞ h2 ∞ ∞ ∞ ∞ • Сначала все значения равны ∞: • На первом шаге рассмотрим строку 0, ее сигнатуры равны h1(0)=h2(0)=1. Все документы имеют 1 в данной строке - следовательно, мы вносим значения h1 и h2 в матрицу сигнатур: r S1 S2 S3 S4 h1 h2 0 1 1 1 1 1 1 1 1 1 0 1 2 4 2 0 1 0 0 3 0 3 1 1 1 0 4 3 4 1 1 1 0 5 6 5 1 0 0 1 6 2 6 0 0 0 1 0 5 S1 S2 S3 S4 h1 1 1 1 1 h2 1 1 1 1 • Далее, рассмотрим строку 1, ее сигнатуры равны h1(1) = 2 и h2(1) = 4. В данной строке только S1, S2 и S4 имеют 1, поэтому только для этих столбцов мы обновляет сигнатуры - равные минимуму между существующем значением и значениями h1(1) = 2 и h2(1) = 4 соответственно: S1 S2 S3 S4 h1 2 2 1 2 h2 4 4 1 4
  45. 45. MINHASH: EXAMPLE S1 S2 S3 S4 h1 2 2 1 2 h2 2 0 1 2 • Продолжаем с остальными строками и после строки с индексом 5 матрица имеет вид • Наконец, рассмотрим строку 6, ее сигнатуры равны h1(6) = 0 и h2(6) = 5. В этой строке только S4 имеет 1, следовательно, обновляем только значения в этом столбце, устанавливая их минимуму существующего значения и 0 для h1 или 5 для h2. Итоговая матрица сигнатур имеет вид: S1 S2 S3 S4 h1 2 2 1 0 h2 2 0 1 2 r S1 S2 S3 S4 h1 h2 0 1 1 1 1 1 1 1 1 1 0 1 2 4 2 0 1 0 0 3 0 3 1 1 1 0 4 3 4 1 1 1 0 5 6 5 1 0 0 1 6 2 6 0 0 0 1 0 5 • Нет полностью идентичных документов в коллекции. • Документы S1 и S2 согласуются по половине сигнатур, т.е. их коэффициент подобия равен 0.5 (точное значение JS = 0.66) • Документы S1 и S4 тоже согласуются по половине сигнатур, т.е. их коэффициент подобия равен 0.5 (точное значение JS = 0.33) • Документы S3 и S4 не согласуются по сигнатурам, т.е. их коэффициент подобия равен 0 (точное значение JS = 0.16666…)
  46. 46. MINHASH: PYTHON • https://github.com/ekzhu/datasketch
 datasketch gives you probabilistic data structures that can process vary large amount of data • https://github.com/anthonygarvan/MinHash
 MinHash is an effective pure python implementation of Minhash
  47. 47. MINHASH: READ MORE • http://infolab.stanford.edu/~ullman/mmds/book.pdf • http://www.cs.cmu.edu/~guyb/realworld/slidesS13/ minhash.pdf • https://en.wikipedia.org/wiki/MinHash • http://www2007.org/papers/paper570.pdf • https://www.cs.utah.edu/~jeffp/teaching/cs5955/L4- Jaccard+Shingle.pdf
  48. 48. ▸ @gakhov ▸ linkedin.com/in/gakhov ▸ www.datacrucis.com THANK YOU

×