programing

HyperLogLog 알고리즘은 어떻게 작동합니까?

oldcodes 2023. 9. 11. 22:12
반응형

HyperLogLog 알고리즘은 어떻게 작동합니까?

저는 최근 여가 시간에 여러 알고리즘에 대해 배우고 있는데, 매우 흥미롭게 보이는 것을 하이퍼로그 알고리즘이라고 합니다. 이것은 목록에 있는 고유한 항목의 수를 추정하는 것입니다.

이는 제가 MySQL 시절에 "Cardinality" 값(최근까지 계산되지 않은 값으로 항상 추정)을 보고 다시 생각해냈기 때문에 특히 흥미로웠습니다.

그래서 나는 O(n)에서 한 배열에 몇 개의 고유한 항목이 있는지 계산하는 알고리즘을 작성하는 방법을 알고 있습니다.자바스크립트로 작성했습니다.

function countUniqueAlgo1(arr) {
    var Table = {};
    var numUnique = 0;
    var numDataPoints = arr.length;
    for (var j = 0; j < numDataPoints; j++) {
        var val = arr[j];
        if (Table[val] != null) {
            continue;
        }
        Table[val] = 1;
        numUnique++;
    }
    return numUnique;
}

하지만 문제는 제 알고리즘이 O(n)인 반면에 메모리를 많이 사용한다는 것입니다.Table).

O(n) 시간에 중복 수를 세는 방법과 최소한의 메모리를 사용하는 방법에 대해 이 논문을 읽고 있습니다.

비트나 어떤 것을 해싱하고 세는 것을 통해 특정 확률(목록이 균등하게 분포되어 있다고 가정) 내에서 목록의 고유 항목 수를 추정할 수 있다는 것을 설명합니다.

신문을 읽었는데 이해가 안 되는 것 같아요.누가 좀 더 일반인의 설명을 해줄 수 있습니까?해시가 무엇인지는 알고 있지만 이 HyperLogLog 알고리즘에서 해시가 어떻게 사용되는지는 이해할 수 없습니다.

이 알고리즘 뒤의 주요한 속임수는 임의의 정수의 스트림을 관찰할 때, 이진 표현이 알려진 접두사로 시작하는 정수를 본다면 스트림의 카디널리티가 2^(접두사의 크기)일 가능성이 더 높다는 것입니다.

즉, 정수의 랜덤 스트림에서 숫자의 ~50%가 "1"로 시작하고, 25%는 "01"로 시작하고, 12.5%는 "001"로 시작합니다.이는 임의 스트림을 관찰하고 "001"을 보면 이 스트림이 8의 카디널리티를 가질 가능성이 더 높다는 것을 의미합니다.

(접두사 "00..1"은 특별한 의미가 없습니다.대부분의 프로세서에서 이진수에서 가장 중요한 비트를 쉽게 찾을 수 있기 때문에 여기에 있습니다.)

물론 한 정수만 관측하면 이 값이 틀릴 가능성이 높습니다.그래서 알고리즘은 스트림을 "m"개의 독립적인 부분 스트림으로 분할하고 보이는 "00..."의 최대 길이를 유지합니다.각 하위 스트림의 접두사 1".그런 다음 각 부분 스트림의 평균값을 사용하여 최종 값을 추정합니다.

그것이 이 알고리즘의 주요 아이디어입니다.몇 가지 누락된 세부 사항(예를 들어 낮은 추정치에 대한 수정)이 있지만, 모두 논문에 잘 기재되어 있습니다.영어가 서툴러서 미안합니다.

HyperLogLog는 확률적인 데이터 구조입니다.목록에서 고유한 요소의 수를 계산합니다.하지만 간단한 방법(집합을 가지고 그 집합에 요소를 추가하는 것)과 비교하면, 이것은 대략적인 방법으로 이루어집니다.

HyperLogLog 알고리즘이 이 작업을 수행하는 방법을 살펴보기 전에 먼저 필요한 이유를 이해해야 합니다.간단한 방법으로 문제는 소비한다는 것입니다.O(distinct elements)◦ 왜요소들 큰 O ?왜 여기에 고유한 요소들 대신 큰 O 표기법이 있습니까?그 이유는 요소의 크기가 다를 수 있기 때문입니다.하나의 요소는 다음과 같을 수 있습니다.1 요소른소소"is this big string"한 목록요소 을합니다. 따라서 거대한 목록(또는 거대한 요소 스트림)을 가지고 있으면 메모리가 많이 필요합니다.


확률적 카운팅

어떻게 하면 여러 고유한 요소들을 합리적으로 추정할 수 있을까요?이고다다fg의 문자열이 있다고 합니다.m {0, 1} 0, 0, 0 2, k 시작 얼마입니까 확률확률균등얼마입니까 ? 0 확률 with , 시작ability prob start으로 시작할 입니까?그렇다.1/2,1/4그리고.1/2^k은 만약 이 .로 합니다. 는 으로 이 한 하는 한 이 으로 하는 k 0,은로다를 했습니다.2^k 좋은 요.그래서 이게 좋은 출발점입니다.게된을는것의것tbyengfta게을된의 )0그리고.2^k - 1이진법 표현에서 0의 가장 큰 접두사의 최대 수를 셀 수 있으며 이는 합리적인 추정치를 제공할 것입니다.

는 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ 0 t 2^k-1달성하기가 너무 어렵습니다(우리가 만난 데이터는 대부분 숫자가 아니며 거의 균등하게 분포되지 않으며 모든 값 사이에 있을 수 있습니다).그러나 좋은 해싱 함수를 사용하면 출력 비트가 균등하게 분배되고 대부분의 해싱 함수는 다음과 같은 값 사이에서 출력을 갖는다고 가정할 수 있습니다.0그리고.2^k - 1(SHA1은 다음과 같은 값을 제공합니다.0그리고.2^160). 은 의 (cardinality)로의 수를 할 수 따라서 지금까지 달성한 것은 다음과 같은 최대 카디널리티로 고유 원소의 수를 추정할 수 있다는 것입니다.k를한만여화화하여 하나만 저장하여 log(k)bits. 단점은 우리의 추정치에 큰 차이가 있다는 것입니다.1984년의 확률론적 계산지를 거의 만들 뻔했던 멋진 것입니다. (추정치를 사용하면 조금 더 똑똑하지만, 여전히 가깝습니다.)

로그 로그

더 나아가기 전에, 우리의 첫 번째 견적이 왜 그렇게 크지 않은지 이해해야 합니다.그 이면에 있는 이유는 고주파수 0-프리픽스 요소의 무작위 발생이 모든 것을 망칠 수 있기 때문입니다.이것을 개선하는 한 가지 방법은 많은 해시 함수를 사용하고, 각 해시 함수에 대해 max를 세고, 최종적으로 평균을 내는 것입니다.이는 추정치를 향상시킬 수 있는 훌륭한 아이디어이지만, LogLog 논문에서는 약간 다른 접근 방식을 사용했습니다(해싱이 다소 비싸기 때문일 수 있습니다).

그들은 하나의 해시를 사용했지만 그것을 두 부분으로 나누었습니다.하나를 버킷(bucket)이라고 합니다(총 버킷 수는2^x)와 또 다른 - 는 기본적으로 우리의 해시와 같습니다.저는 무슨 일이 일어나고 있는지 이해하기 어려웠기 때문에 예를 들어보겠습니다.두 개의 요소와 값 형태를 제공하는 해시 함수가 있다고 가정합니다.02^10된 두 의 값:된 2값의:값344그리고.38716개의 양동이를 했습니다. 16개의 양동이를 갖기로 하셨잖아요.그럼 다음과 같은 것이.

0101 011000  bucket 5 will store 1
0110 000011  bucket 6 will store 4

버킷을 더 많이 사용하면 분산이 줄어듭니다(공간을 조금 더 많이 사용하지만 공간은 여전히 작음).할 수 즉,학을여를할다수은다수할geh학s(yoe ).1.3/sqrt(number of buckets)).

HyperLogLog

HyperLogLog는 새로운 아이디어를 소개하지는 않지만 대부분 이전 추정치를 개선하기 위해 많은 수학을 사용합니다.연구원들은 양동이에서 가장 큰 숫자의 30%를 제거하면 추정치가 크게 향상된다는 것을 발견했습니다.그들은 또한 숫자를 평균화하는 또 다른 알고리즘을 사용했습니다.그 종이는 수학이 무겁습니다.


그리고 hyperLogLog 알고리즘의 개선된 버전을 보여주는 최신 논문으로 마무리하고자 합니다(지금까지는 완전히 이해할 시간이 없었지만 나중에 이 답변을 개선할 수 있을 것 같습니다).

직관적으로는 입력값이 큰 난수 집합(예: 해시값)이라면 범위에 걸쳐 균등하게 분포해야 합니다.1024까지의 값을 나타내기 위해 범위가 최대 10비트라고 가정합니다.그런 다음 최소값을 관찰합니다.10이라고 치자.그러면 카디널리티는 약 100(10 × 100 ≥ 1024)으로 추정됩니다.

물론, 진짜 논리를 위해 신문을 읽으세요.

샘플 코드가 포함된 또 다른 좋은 설명은 여기에서 찾을 수 있습니다.
Algorithms:- Blog : 의 -

언급URL : https://stackoverflow.com/questions/12327004/how-does-the-hyperloglog-algorithm-work

반응형