큰 집합에서 유사한 item을 찾는 일반적인 방법은
각 모든 조합을 찾아서 비교하는 것인데 이는 가장 정확하지만 비효율적이다.
그렇다면 조금 더 빠른 방법은 없을까?
이름부터 hsah의 일종임을 알려주고 있다.
hashing을 통해서 동일한 값을 찾을 수는 있었지만 유사한 값을 찾는 개념이 조금은 어색하다
LSH의 과정은 다음과 같다.
- 여러개의 해쉬함수를 사용해서 item들을 bucket에 넣는다.
- 이 과정에서 적어도 한 번 같은 bucket에 들어간 조합들을 찾는다.
- 위에서 찾은 조합들에 대해서 비교해본다.
같은 bucket에 들어간 조합들에 대해서만 검증이 이루어지므로, 비교하는 횟수가 크게 줄어든다.
하지만 false-negative(실제로는 similar items이지만 다른 bucket에 들어감)같은 단점도 존재한다.
모든 문서나 data에 대해서 LSH를 바로 적용하면 좋겠지만
몇가지 과정을 거쳐야 한다.
Shingling
Minhashing
LSH focus on pairs of signatures likely to be similar
shingles: 문서에서 k-shingle이란 sequence of k characters, k개의 문자의 나열이다.
i.e. k=2 , docs = abcab
Set of 2-shingles = {ab,bc,ca} (집합이기에 중복 x)
유사도와 Shingles
적절한 k
From Sets to Boolean Matrices
rows: 가능한 모든 원소의 집합 (U)
col: 집합 (문서)
(e,s)에서 e가 S의 포함되면 1 아니면 0
개념적인 행렬임
type of row
col 간의 유사도 (jaccard similarity와 동일)
Minhashing(개념적인 방법)
h(c1)=h(c2)일 확률은 Sim(c1,c2)와 동일하다
Sim(c1,c2) = a/(a+b+c)
h(c1) = h(c2)인 경우는 type-a row일 경우이고 나머지는 b,c의 경우
따라서 위 2가지는 확률적으로 동일하다.
충분한 길이의 signatures는 hashing후에도 유사도를 보존 다시말해 signature가 너무 짧으면 유사도를 보존하기 힘든 경우가 있다는 이야기
(이미지 교체 예정)
Minhashinig의 실제 구현
permutation을 많은 hash function으로 근사
위에서 사용한 hash value가 새로 바뀐 행의 번호
각 Column c에 대해서 hash func hi는 M(i,c)를 가진다.
각 row r, colummn c에 대해서 r에서 c가 1일 때 , hi(c)의 가장 작은 값이 M(i,c)가 된다.
(이미지 교체 예정)
c 에대해서 1인 row가 바뀐 행 번호를 보고 가장 적은 걸 찾는 과정
실제 permutation하고 찾는것과 유사.
조금 더 향상된 Minhashing