Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Терминология [ править ]

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

Алгоритм [ править ]

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

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

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

Операции [ править ]

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

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

Добавить [ редактировать ]

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

Подсчитать [ править ]

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

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

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

Практические соображения [ править ]

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

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

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

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

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

Объединить [ править ]

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

Сложность [ править ]

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

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

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

HLL ++ [ править ]

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

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

Потоковое HLL [ править ]

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

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

Ссылки [ править ]

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