Может ли кто-нибудь объяснить мне алгоритм Lossy Counting? Это потоковый алгоритм поиска частоты элементов в потоке. Спасибо.
Что такое Lossy Counting?
Ответ 1
Скажите, что вы просматриваете трафик для профилей facebook. У вас есть миллиарды хитов. Вы хотите найти, какие профили доступны наиболее часто. Вы могли бы вести подсчет для каждого профиля, но тогда у вас было бы очень большое количество подсчетов для отслеживания, подавляющее большинство из которых было бы бессмысленным.
С подсчетом потерь вы периодически удаляете очень низкие элементы подсчета из таблицы. В большинстве случаев наиболее часто просматриваемые профили никогда не будут иметь низкое значение, и если они это сделают, они вряд ли останутся там надолго.
Алгоритм в основном включает группировку входов в блоки или куски и подсчет внутри каждого фрагмента. Затем вы уменьшаете счетчик для каждого элемента на единицу, отбрасывая любые элементы, чьи отсчеты сбрасываются до нуля.
Наиболее часто попадающиеся профили получат ваш счет и останутся там. Любые профили, которые не попадают очень часто, упадут до нуля в несколько блоков, и вам больше не придется отслеживать их.
Обратите внимание, что конечные результаты зависят от порядка, давая более тяжелый вес последним обработанным счетам. В некоторых случаях это имеет прекрасный смысл и скорее наоборот, чем недостаток. (Если вы хотите знать, какие профили наиболее популярны сейчас, вы хотите сегодня больше загружать доступ, чем получать доступ в прошлом месяце.)
В алгоритме имеется большое количество уточнений. Но основная идея заключается в том, чтобы найти тяжелых нападающих без необходимости отслеживать каждый элемент, периодически чистить ваши счета любых элементов, которые пока не могут быть тяжелыми нападающими на основе данных.
Ответ 2
Вы можете найти объяснение того, как Lossy Counting (и Sticky Sampling) работают в этом сообщении в блоге и версия с открытым исходным кодом здесь.
Наиболее часто просматриваемые предметы "выживают". Учитывая порог частоты f, частотную ошибку e и общее количество элементов N, выход можно выразить следующим образом: Элементы со счетчиком, превышающим fN - eN.
В худшем случае нам нужны (1/e) * log (eN) счетчики.
Например, мы можем напечатать страницы Facebook людей, которые попадают более чем на 20%, с порогом ошибки 2% (правило: ошибка = 10% от порога частоты).
Для частоты f = 20%, e = 2%, будут выводиться все элементы с истинной частотой, превышающей f = 20% - нет ложных негативов. Но мы недооцениваем. Выходная частота элемента может быть меньше его истинной частоты не более чем на 2%. Ложные срабатывания могут появляться с частотой от 18% до 20%. Наконец, ни один элемент с частотой менее 18% не будет выводиться.
При заданном окне размера 1/e сохраняются следующие гарантии:
- Частоты недооцениваются не более e * N
- Нет ложных негативов
- Ложные срабатывания имеют истинную частоту не менее fN - eN