가능한 모든 쌍을 비교하지 않고도 비슷한 항목 쌍을 찾을 수 있도록 코사인 로컬 리티에 민감한 해시를 작성하려고합니다. 나는 기본적으로 작동하지만 내 데이터의 대부분의 쌍은 -0.2에서 +0.2 범위의 코사인 유사성을 가진 것처럼 보이므로 상당히 미세하게 주사위를 굴려 코사인 유사성이 0.1 이상인 것을 선택하려고합니다.
Mining Massive Datasets 3 장을 읽었습니다. 이것은 Locality-Sensitive Family를 증폭하여 후보 쌍 선택의 정확성을 높이는 것에 대해 이야기합니다. 나는 수학적 설명을 이해하려고 생각하지만 실제로 이것을 구현하는 방법을 고심하고 있습니다.
지금까지 내가 가진 것은 다음과 같습니다
- 나는 1M 사용자의 일부 선택의 등급이 각각 1000 영화를 말한다. 각 영화는 사용자 점수 (행 번호 = 사용자 ID, 값 = 사용자 점수)의 희소 벡터로 표시됩니다.
- N 개의 랜덤 벡터를 만듭니다. 벡터 길이는 영화 벡터의 길이 (예 : 사용자 수)와 일치합니다. 벡터 값은 +1 또는 -1입니다. 실제로 공간을 절약하기 위해이 벡터를 이진수로 인코딩하여 +1은 1에, -1은 0에 매핑합니다.
- 나는 영화와 각 N 개의 랜덤 벡터의 내적을 취하여 각 무비에 대한 스케치 벡터를 작성합니다 (또는 N 개의 랜덤 벡터를 수평으로 놓고 서로 겹쳐서 스케치하여 행렬 R을 만드는 경우 스케치 영화 m의 경우 R * m), 결과 벡터의 각 요소의 부호를 취하므로 +1과 -1의 각 영화에 대한 스케치 벡터로 끝나고 다시 이진으로 인코딩합니다. 각각의 벡터는 길이 N 비트이다.
- 다음으로 다음을 수행하여 비슷한 스케치를 찾습니다.
- 스케치 벡터를 r 비트의 b 밴드로 나눕니다.
- r 비트의 각 밴드는 숫자입니다. 그 번호를 밴드 번호와 결합하고 영화를 그 번호 아래의 해시 버킷에 추가합니다. 각 영화는 둘 이상의 버킷에 추가 할 수 있습니다.
- 그런 다음 각 버킷을 살펴 봅니다. 동일한 버킷에있는 모든 영화는 후보 쌍입니다.
이것을 3.6.3 mmds와 비교하면 AND 단계는 r 비트의 밴드를 볼 때입니다. r 비트의 값이 같은 경우 영화 쌍이 AND 단계를 통과합니다. 내 OR 단계는 버킷에서 발생합니다. 영화가 버킷에 모두 있으면 영화는 후보 쌍입니다.
이 책에서는 AND 및 OR 단계를 더 추가하여 결과를 "증폭"할 수 있다고 제안하지만, 추가 레이어의 구성 프로세스에 대한 설명이 쌍별 평등을 확인하는 것이 아니라 실제로이를 수행하는 방법에 대한 손실이 있습니다. 버킷 번호가 나타납니다.
아무도 내가 이것을하는 방법을 이해하도록 도울 수 있습니까?