NumPy 기초·연습 문제

Top-k 코사인 이웃 검색

문제 설명PROBLEM

preview

Top-k 코사인 이웃 검색

18번 코사인 행렬 의 실전 응용. 행렬을 계산해서 각 쿼리마다 상위 k개의 이웃 인덱스 를 돌려주는 패턴은 벡터 검색 의 가장 기본 루프입니다:

  • 문서 임베딩에서 비슷한 문서 찾기
  • 이미지 임베딩 기반 검색
  • 추천 시스템 (user→item, item→item)

알고리즘

  1. 코사인 유사도 행렬 계산 (N_query, N_db).
  2. 각 행을 내림차순 정렬 → 상위 k 인덱스 선택.
  3. argsort 는 오름차순이므로 -sim 쓰거나 [:, -k:] 를 뒤집는다.

top-k(Xq,Xdb)i=argsort(cos(Xq,Xdb)i)[:k]\text{top-k}(X_q, X_{db})_i = \text{argsort}(-\text{cos}(X_q, X_{db})_i)[:k]

과제

함수 top_k_cosine(X_query, X_db, k) 를 완성하세요.

  • X_query shape (N_query, D), X_db shape (N_db, D).
  • 반환: shape (N_query, k) 정수 인덱스 배열. 각 행은 유사도 내림차순.

테스트 케이스

#이름검증
1shape (Nq, k)정확
2query ⊂ db 이면 top-1 == 자기자신완벽 일치 행은 1위
3k = 1 의 각 결과가 argmax 와 일치수동 계산으로 확인
4인덱스 유효성0 ≤ idx < N_db
5내림차순 순서cos[top_k[:, 0]] ≥ cos[top_k[:, 1]] ≥ ...
개념 노트와 실수 포인트

NumPy 기초

  • ⚠️ axis 헷갈림: axis=0 은 행을 가로질러 → 열별 결과, axis=1행별 결과.
  • 브로드캐스팅: shape 를 뒤에서부터 맞춤(1 또는 같은 크기).
  • 반복문 대신 벡터화 연산. @(행렬곱) 와 *(요소곱) 구분.