HyperLogLog - HyperLogLog

HyperLogLog алгоритм для проблема с подсчетом, аппроксимируя количество различных элементов в мультимножество.[1] Расчет точный мощность мультимножества требует объема памяти, пропорционального мощности, что непрактично для очень больших наборов данных. Вероятностные оценщики мощности, такие как алгоритм HyperLogLog, используют значительно меньше памяти, чем это, за счет получения только приблизительного значения мощности. Алгоритм HyperLogLog может оценивать мощности> 109 с типичной точностью (стандартная ошибка) 2%, используя 1,5 КБ памяти.[1] HyperLogLog - это расширение более раннего алгоритма LogLog,[2] сам происходящий из 1984 Алгоритм Флажолета – Мартина.[3]

Терминология

В оригинальной статье Флажоле и другие.[1] и в соответствующей литературе по проблема с подсчетом, термин «количество элементов» используется для обозначения количества отдельных элементов в потоке данных с повторяющимися элементами. Однако в теории мультимножества термин относится к сумме кратностей каждого члена мультимножества. В этой статье используется определение Флажолета для согласованности с источниками.

Алгоритм

В основе алгоритма HyperLogLog лежит наблюдение, что мощность мультимножества равномерно распределенных случайных чисел может быть оценена путем вычисления максимального количества ведущих нулей в двоичном представлении каждого числа в наборе. Если максимальное количество наблюдаемых ведущих нулей равноп, оценка количества различных элементов в наборе равна 2п.[1]

В алгоритме HyperLogLog хэш-функция применяется к каждому элементу в исходном мультимножестве, чтобы получить мультимножество равномерно распределенных случайных чисел с той же мощностью, что и исходное мультимножество. Затем мощность этого случайно распределенного набора может быть оценена с помощью описанного выше алгоритма.

Недостатком простой оценки мощности, полученной с помощью описанного выше алгоритма, является большая отклонение. В алгоритме HyperLogLog дисперсия минимизируется путем разделения мультимножества на многочисленные подмножества, вычисления максимального количества ведущих нулей в числах в каждом из этих подмножеств и использования гармоническое среднее объединить эти оценки для каждого подмножества в оценку мощности всего набора.[4]

Операции

HyperLogLog выполняет три основные операции: Добавить чтобы добавить в набор новый элемент, считать чтобы получить мощность множества и слияние чтобы получить объединение двух наборов. Некоторые производные операции могут быть вычислены с помощью Принцип включения-исключения словно мощность пересечения или мощность разницы между двумя журналами HyperLogLog, объединяющими операции слияния и подсчета.

Данные HyperLogLog хранятся в массиве M счетчиков называется регистрами с размером м которые установлены в 0 в исходном состоянии.

Добавлять

Операция добавления состоит из вычисления хэша входных данных. v с хеш-функцией час, получая первый б биты (где б является ) и добавив к ним 1, чтобы получить адрес изменяемого регистра. С оставшимися битами вычисляем который возвращает позицию крайнего левого 1. Новое значение регистра будет максимальным между текущим значением регистра и .

Считать

Алгоритм подсчета состоит в вычислении гармонического среднего значения м регистров и используя константу для получения оценки подсчета:

Интуиция такова, что п быть неизвестной мощностью M, каждое подмножество буду иметь элементы. потом должно быть близко к . Среднее гармоническое значение 2 для этих величин равно который должен быть рядом . Таким образом, должно быть п примерно.

Наконец, постоянная вводится для исправления систематического мультипликативного смещения, присутствующего в из-за хеш-коллизий.

Практические соображения

Постоянная не просто вычислить, и его можно аппроксимировать формулой[1]

Однако метод HyperLogLog смещен для малых значений мощности ниже порога . В исходной статье предлагается использовать другой алгоритм для малых мощностей, известный как линейный счет.[5] В случае, если приведенная выше оценка меньше порога , можно использовать альтернативный расчет:

  1. Позволять - количество регистров, равное 0.
  2. Если используйте стандартный оценщик HyperLogLog над.
  3. В противном случае используйте линейный счет:

Кроме того, для очень больших мощностей, приближающихся к пределу размера регистров ( для 32-битных регистров) мощность можно оценить с помощью:

С учетом приведенных выше поправок на нижнюю и верхнюю границы ошибку можно оценить как .

Объединить

Операция слияния двух HLL () заключается в получении максимума для каждой пары регистров

Сложность

Для анализа сложности потоковая передача данных модель[6] используется, который анализирует пространство, необходимое для получения приближение с фиксированной вероятностью успеха . Относительная погрешность HLL составляет и это нужно пространство, где п - установленная мощность и м - количество регистров (обычно меньше одного байта).

В Добавить операция зависит от размера вывода хеш-функции. Поскольку этот размер фиксирован, мы можем считать, что время выполнения операции добавления составляет .

В считать и слияние операции зависят от количества регистров м и иметь теоретическую стоимость . В некоторых реализациях (Redis )[7] количество регистров фиксировано, а стоимость считается равной в документации.

HLL ++

Алгоритм HyperLogLog ++ предлагает несколько улучшений в алгоритме HyperLogLog для уменьшения требований к памяти и повышения точности в некоторых диапазонах мощности:[6]

  • 64-битная хеш-функция используется вместо 32-битной, использованной в исходной статье. Это уменьшает хеш-коллизии для больших мощностей, что позволяет убрать поправку на большой диапазон.
  • Некоторое смещение обнаружено для малых мощностей при переходе от линейного счета к счету HLL. Для смягчения проблемы предлагается коррекция эмпирического смещения.
  • Предлагается разреженное представление регистров, чтобы уменьшить требования к памяти для малых мощностей, которые позже могут быть преобразованы в плотное представление, если количество элементов растет.

Потоковое HLL

Когда данные поступают в одном потоке, историческая обратная вероятность или оценка мартингейла [8][9]значительно повышает точность эскиза HLL и использует на 36% меньше памяти для достижения заданного уровня ошибок. Эта оценка доказуемо оптимальна для любого дублирующего нечувствительного приблизительного отдельного счетного скетча в одном потоке.

Сценарий с одним потоком также приводит к вариантам построения эскиза HLL. HLL-TailCut + использует на 45% меньше памяти, чем исходный эскиз HLL, но за счет того, что он зависит от порядка вставки данных и не может объединить эскизы.[10]

Рекомендации

  1. ^ а б c d е Флажолет, Филипп; Фузи, Эрик; Гандуэ, Оливье; Менье, Фредерик (2007). «Hyperloglog: анализ алгоритма почти оптимальной оценки мощности» (PDF). Дискретная математика и теоретическая информатика Труды. Нанси, Франция. AH: 127–146. CiteSeerX  10.1.1.76.4286. Получено 2016-12-11.
  2. ^ Durand, M .; Флажолет, П. (2003). «Журнал учета больших мощностей». (PDF). В Дж. Ди Баттиста и У. Цвик (ред.). Конспект лекций по информатике. Ежегодный Европейский симпозиум по алгоритмам (ESA03). 2832. Springer. С. 605–617.
  3. ^ Флажолет, Филипп; Мартин, Дж. Найджел (1985). «Вероятностные алгоритмы подсчета для приложений баз данных» (PDF). Журнал компьютерных и системных наук. 31 (2): 182–209. Дои:10.1016/0022-0000(85)90041-8.
  4. ^ S Heule, M Nunkesser, A Hall (2013). «HyperLogLog на практике: алгоритмическая разработка современного алгоритма оценки мощности» (PDF). сек 4.CS1 maint: использует параметр авторов (связь)
  5. ^ Ван, Кю-Ён; Вандер-Занден, Брэд Т; Тейлор, Ховард М (1990). «Вероятностный алгоритм подсчета с линейным временем для приложений баз данных». Транзакции ACM в системах баз данных. 15 (2): 208–229. Дои:10.1145/78922.78925.
  6. ^ а б «HyperLogLog на практике: алгоритмическая разработка современного алгоритма оценки мощности». Получено 2014-04-19.
  7. ^ «PFCOUNT - Redis».
  8. ^ Коэн, Э. (март 2015 г.). «Пересмотренные эскизы всех расстояний: оценки HIP для анализа массивных графиков». IEEE Transactions по разработке знаний и данных. 27 (9): 2320–2334. arXiv:1306.3284. Дои:10.1109 / TKDE.2015.2411606.
  9. ^ Тинг, Д. (август 2014 г.). «Потоковый приблизительный подсчет отдельных элементов: превосходство над оптимальными пакетными методами». Материалы 20-й Международной конференции ACM SIGKDD по открытию знаний и интеллектуальному анализу данных (KDD '14): 442–451. Дои:10.1145/2623330.2623669. ISBN  9781450329569.
  10. ^ Xiao, Q .; Zhou, Y .; Чен, С. (май 2017 г.). «Лучше с меньшим количеством битов: повышение производительности оценки мощности больших потоков данных». IEEE INFOCOM 2017 - Конференция IEEE по компьютерным коммуникациям: 1–9. Дои:10.1109 / INFOCOM.2017.8057088. ISBN  978-1-5090-5336-0.