[t:/]$ 지식_

교집합 빠르게 구하기

2021/03/23

minhash로 피처의 비트맵 벡터를 만든다음 numpy 로 행렬곱 구한 스칼라 값 = 교집합 갯수... 가 되는 원리를 사용했으나 드릅게 느리군요..

걍 파이썬 set() & set()이 빠름. scipy의 희소행렬을 쓰면 빠를까..

풀이 : 자카드 유사도를 대량으로 구할 때, 각 피처의 교집합을 구하고자 하나, 피처가 많으면 (예 : 우리말 단어) 교집합 연산이 드릅게 느려집니다. 이를 회피하는 방법이 minhash 입니다. minhash를 구현하면 결과적으로 [0, 1, 1, 0...] 과 같은 벡터가 나오는데 차원의 갯수는 사용한 해시 함수의 갯수가 됩니다. 적당히 줄여가며 뚜드려 맞춥니다. 이제 a와 b의 유사도를 구하려면 dot (a, b) 행렬 곱만 구하면 교집합의 갯수 값이 숫자(=스칼라)로 나옵니다. 좋을까요? 나쁠까요? (물론 대각행렬 구해서 계산은 반까이만 하고... 생략)

결과 : 느립니다. numpy의 벡터 루핑 연산은 겁나게 빠르다고 알려져있지만 대규모 중첩 루핑 연산에선 느립니다. 그냥 for a for b set(a) & set(b)가 빠르군요. set은 논리적으로 O(1)이므로 전체 루핑을 수행하지 않습니다. (내부적으로는 트리, 버킷 순회가 있습니다만) 하지만 scipy에는 희소행렬 처리를 해준다는군요. 안 해봤습니다. 귀찮아요. 안 할꺼야.

잘난척을 짧게 쓰면 이 눔 또 잘난척이야 하지만 길게 쓰면 그냥 패쓰하므로 안심입니다. 여기까지 읽고 끄덕이는 사람이 한 두 사람 정도는 있을 것으로 기대해봅니다만 아마도 한민호님은 관성적으로 좋아요를 누를 것 같습니다. 제바알..









[t:/] is not "technology - root". dawnsea, rss