Як працюють масштабовані фільтри цвітіння?


15

Я читав фільтри, що масштабуються, і не міг зрозуміти, як кожен раз, коли заповнюються складові фільтри цвітіння, додається новий фільтр із більшим розміром.

Елементи, що сприяли встановленню бітів у первісно створених фільтрах, не можуть шукати присутність. Можливо, я помиляюся в розумінні цього?

Я розумію основні фільтри цвітіння. Однак я не можу обернути голову навколо динамічних фільтрів цвітіння.

Відповіді:


7

Дозвольте мені спробувати це зробити, щоб побачити, наскільки я можу його відрізати. :-)

Отже, для початку потрібно мати можливість створити звичайний фільтр цвітіння, який дозволяє встановити кінцеву кількість елементів з максимальною ймовірністю помилкового додатного. До того, як спробувати створити масштабовану реалізацію, потрібно додати ці функції до вашого базового фільтра.

Перш ніж ми спробуємо контролювати та оптимізувати, яка ймовірність, давайте розберемося, яка ймовірність для заданого розміру фільтра цвітіння.

Спочатку ми розділили бітфілд на кількість хеш-функцій (загальна кількість біт / кількість хеш-функцій = зрізів), щоб отримати k фрагментів бітів, які представляють кожну хеш-функцію, тому кожен елемент завжди описується k бітами.

Якщо збільшити кількість фрагментів або кількість бітів на фрагмент, ймовірність помилкових позитивних результатів зменшиться.

З цього випливає, що в міру додавання елементів більше бітів встановлюється на 1, тому помилкові позитивні збільшуються. Ми називаємо це "коефіцієнтом заповнення" кожного шматочка.

Коли фільтр містить велику кількість даних, ми можемо припустити, що ймовірність помилкових спрацьовувань цього фільтра - це коефіцієнт заповнення, піднятий до кількості зрізів (Якщо насправді слід було порахувати біти, а не використовувати коефіцієнт, це спрощує перестановка з проблемою повторення).

Отже, як ми з'ясуємо, як підібрати ймовірність помилкових спрацьовувань у фільтрі цвітіння? Ми можемо змінити кількість скибочок (що вплине на коефіцієнт заповнення).

Щоб розібратися, скільки скибочок у нас повинно бути, ми почнемо з з'ясування оптимального співвідношення заливки для скибочки. Оскільки коефіцієнт заповнення визначається кількістю бітів у зрізі, який дорівнює 1 проти кількості бітів, який дорівнює 0, ми можемо визначити, що кожен біт залишатиметься невстановленим з вірогідністю (100% - (1 / біт у зрізі) ). Оскільки у нас буде вставлено кілька елементів, у нас є ще одна перестановка з проблемою репутації, і ми розширюємо речі до очікуваного коефіцієнта заповнення, який становить (100% - ((100% - (1 / біт у шматочку)) ^ "елементи вставлені")). Ну, виявляється, це дуже схоже на інше рівняння. У роботі вони відносять коефіцієнт заповнення до іншого рівняння, тому воно добре вписується в ряд Тейлора (1 -е ^ (- п / м)). Після трохи обмивання цього виходить, що оптимальне співвідношення заливки завжди становить близько 50%,

Отже, оскільки ймовірність фільтра - це коефіцієнт заповнення, піднятий до кількості скибочок, ми можемо заповнити 50% і отримати P = (50%) ^ k або k = log_2 (1 / P). Потім ми можемо скористатися цією функцією для обчислення кількості фрагментів, які ми повинні генерувати для даного фільтра, у списку фільтрів для фільтра масштабованого цвітіння.

    def slices_count(false_positive_probability):
        return math.ceil(math.log(1 / false_positive_probability, 2))

Редагувати: Після написання цього слова я натрапив на згадку про "п’ятдесятивідсоткове правило" під час читання динамічного розподілу пам’яті, заснованого на системі приятелів, в TAoCP Vol 1, pp 442-445, з набагато більш чистими міркуваннями проти підгонки кривої до (1 -е ^ (- п / м)). Кнут також посилається на статтю "Правило п'ятдесяти відсотків переглянуто" з деякою інформацією про концепцію ( pdf доступна тут ).


У цьому документі немає обговорення фільтрів Bloom, тому не бачачи жодного виправдання цього "правила п'ятдесяти відсотків". Апріорі, я б очікував, що "правило п'ятдесяти відсотків" - це лише якийсь фокус покірних людей, оскільки реальна відповідь передбачає купу міркувань, що виходять за рамки критеріїв проектування їх конкретного модуля.
Джефф Бердджес

1
Привіт @JeffBurdges, ти не вважаєш принаймні цікавим, що ці два поняття так схожі?
Джон Брінгхерст

4

Елемент знаходиться у фільтрі масштабованого цвітіння, якщо будь-який фільтр повертає значення true. Отже, ви можете додавати фільтри, не впливаючи на запити членства для попередніх елементів.

Щоб переконатися, що у вас все ще є найгірша помилкова позитивна гарантія, додаються нові фільтри з помилковими позитивними показниками, які геометрично зменшуються. Наприклад, перший фільтр має помилкові спрацьовування p, другий rp, третій r^2pі т.д. ймовірність помилкових позитивний над масштабується кольором фільтром потім , обмежене об'єднанням пов'язаним: sum_{k>=0} r^k p = p/(1-r).


3
Що у цих формулах відображає 'r'?
zslayton

2

Я читав фільтри, що масштабуються, і не міг зрозуміти, як кожен раз, коли заповнюються складові фільтри цвітіння, додається новий фільтр із більшим розміром.

Елементи, що сприяли встановленню бітів у первісно створених фільтрах, не можуть шукати присутність. Можливо, я помиляюся в розумінні цього?

Привіт,
Основна ідея - додати до першого фільтра, поки бітове поле фільтра першого рівня не буде насичене. Насичення не означає, що використовується кожен біт, але це означає, що фільтр містить стільки записів, що додаткові записи створюють занадто багато помилкових позитивних результатів.

З моменту насичення будь-який новий елемент буде доданий не до насиченого фільтра, а до свіжого та більшого підфільтра (фільтр другого рівня).

Для того, щоб знайти значення, ви шукаєте його у фільтрі першого рівня, а якщо ви не можете його знайти, ви шукаєте його у фільтрі другого рівня. Якщо ви можете знайти його в будь-якому з цих фільтрів, він (з хорошого шансу) "відомий" фільтру (помилкові позитиви можуть виникати внаслідок характеру фільтрів Bloom). Якщо ви не можете знайти значення в жодному з фільтрів, фільтр гарантовано його не бачив. Це, звичайно, може виражатися як рекурсивна структура даних.

Ви можете прочитати мій пост у блозі, який містить масштабовану реалізацію фільтра Bloom на Java та пояснення того, як він детально працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.