← 문제 목록/코사인 유사도 행렬 (정규화 Gram)
문제 해설

코사인 유사도 행렬 (정규화 Gram)

선형대수 · easy

preview

코사인 유사도 행렬 (정규화 Gram)

62번 Gram 행렬내적 의 모든 쌍. 내적은 벡터 길이 에 영향받아 "긴 벡터끼리 더 유사"로 편향될 수 있습니다. 해결은 행 정규화:

Sij=xixjxixj=cosθijS_{ij} = \frac{\mathbf{x}_i \cdot \mathbf{x}_j}{\|\mathbf{x}_i\| \, \|\mathbf{x}_j\|} = \cos\theta_{ij}

  • SS 의 값은 [1,1][-1, 1], 대각은 11 (자기 자신과의 코사인).
  • X~\tilde X 가 행별 L2-정규화된 XXS=X~X~S = \tilde X \tilde X^\top정규화 Gram 이라 부르는 이유.

어디에 쓰이나

  • 문서 유사도 (TF-IDF 벡터)
  • 추천 시스템 (사용자/아이템 임베딩 쌍별 유사도)
  • 검색, ANN (Approximate Nearest Neighbors)
  • attention 의 사전 초기화 연구

구현 트릭

norms = np.linalg.norm(X, axis=1, keepdims=True)  # (N, 1)
X_norm = X / np.clip(norms, 1e-12, None)
S = X_norm @ X_norm.T                             # (N, N)

과제

함수 cosine_similarity_matrix(X) 를 완성하세요.

  • X shape (N, D).
  • 반환: (N, N), 값 [1,1]\in [-1, 1], 대각 = 1 (영벡터 아니라면).
  • 영벡터 안전 처리: norm clip 으로 0 division 방지.
  • 루프 금지.

테스트 케이스

#이름검증
1shape (N, N)
2대각 = 1 (영벡터 없으면)
3대칭S == S.T
4값 범위 ⊂ [-1, 1]
5스케일 불변S(αX) == S(X)
6루프 금지
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.