5. BLOOM FILTER
• предложил Burton Howard Bloom, 1970
• Bloom filter это реализация вероятностного множества с 3
операциями:
• добавить элемент в множество
• проверить, что элемент принадлежит множеству
• проверить, что элемент не принадлежит множеству
• Bloom filter описывается 2 параметрами:
• m - длина фильтра
(пропорциональна ожидаемому числу элементов n)
• k - число различных хэш-функций
(k намного меньше, чем m)
• Bloom filter не хранит сами элементы и требует только 1 byte на
единицу сохраненных данных
6. BLOOM FILTER: ALGORITHM
• Bloom filter представляет собой bit array длиной m bits, все
элементы которого равны 0 в самом начале
• Добавление элемента - вычислить значения всех k хэш-
функций для данного элемента и установить биты с
соответствующими индексами
• Проверка принадлежности элемента - вычислить значения
всех k хэш-функций для данного элемента и проверить биты
с соответствующими индексами:
• если все биты установлены, тогда ответ “может быть”
• если хотя бы 1 бит установлен, тогда ответ “точно нет”
• Время, необходимое для добавления элемента или его
проверки, является постоянным O(k) и не зависит от
количества элементов множества
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. 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. 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. 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. BLOOM FILTER: VARIANTS
• Attenuated Bloom filters используют массивы фильтров для
вычисления кратчайших путей
• Spectral Bloom filters используются для оценки частот элементов.
• Counting Bloom Filters являются раширением классического
варианта, поддерживающим операцию удаления. Вместо одного
бита, они используют счетчик элементов, который увеличивается
при кадой операции добавления и уменьшается при удалении.
• Compressed Bloom filters предназначены для оптимизации
размера фильтра при сохранении приемлемой вероятности ошибки.
• Bloom Filter Cascade реализуют фильтрацию через каскад из Bloom
filters.
• Scalable Bloom Filters могут динамически адаптироваться к
количеству сохраненных элементов, поддерживая требуемую
оценку вероятности ошибки.
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
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. 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) при условии, что все хэш-функции могут быть вычислены на
постоянное время.
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. COUNT-MIN SKETCH: APPLICATIONS
• AT&T использует Count-Min Sketch в сетевых
коммутаторах для анализа трафика в условиях
ограниченной памяти
• Google использует “count sketch” (предшественник
count-min sketch) в своей инфраструктуре
параллельного вычисления MapReduce
• Реализован как часть библиотеки Algebird от
Twitter
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
30. LINEAR COUNTING: ALGORITHM
• Линейный счетчик это битовый массив (хэш-
таблица) размера m (все равны 0).
• Алгоритм состоит из нескольких шагов:
• для каждого элемента множества вычислить
значение хэш-функции и установить
соответствующий бит
• вычислить долю V пустых битов в структуре
(отношение числа пустых битов к размеру счетчика m )
• вычислить оценку мощности множества как
n ≈ -m ln V
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. LINEAR COUNTING: READ MORE
• http://dblab.kaist.ac.kr/Prof/pdf/Whang1990(linear).pdf
• http://www.codeproject.com/Articles/569718/
CardinalityplusEstimationplusinplusLinearplusTimep
37. SIMILARITY
• Как правило, в задачах информационного поиска (Information
Retrival, IR) возникает необходимость оценки подобия
документов
• Документ может быть представлен набором своих слов (“bag
of words”) и рассматриваться как множество элементов
некоего универсального множества слов, составляющих все
документы коллекции
• Jaccard similarity для двух множеств A и B:
JS =
A ∩ B
A ∪ B
38. MINHASH: MATRIX REPRESENTATION
• Коллекция множеств может быть представлена для наглядности
как характеристическая матрица C.
• Столбцы матрицы соответствуют множествам, а строки -
элементам универсального множества всех элементов, из
которых состоят множества
• C(r, c) =1 если элемент в строке r принадлежит множеству в
столбце c, иначе C(r,c) =0
• ВАЖНО: Характеристическая матрица не используется для
непосредственного хранения данных - только для из
представления.
• Одной из причин этого - разреженность матрицы в большинстве случаев.
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. MINHASH: INTUITION
• Значение minhash для каждого столбца характеристической
матрицы - значение индекса первой строки в перестановке, при
которой в столбце стоит 1
• Для вычисления minhash для всей коллекции (представленной
такими столбцами), необходимо выбрать перестановки строк.
• Для большой характеристической матрицы это не достижимо за
ограниченное время, т.к. приходится выбирать миллионы и
миллиарды строк (это даже без учета сортировки).
• Можно смоделировать эффект случайных перестановок, путем
выбора случайных хэш-функций, которые отображают индексы
строк в количество ячеек, равному количеству столбцов.
• Вместо выбора n случайных перестановок столбцов, достаточно
вычислить n случайно выбранных хэш-функций h1, h2, . . . , hn для
индексов строк
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. MINHASH: PROPERTIES
• Связь между minhash и Jaccard similarity:
• Вероятность того, что функция minhash для случайной
перестановки строк вернет одинаковое значение для двух
множеств равна значению Jaccard similarity этих множеств
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. 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. 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…)