
코사인 유사도 행렬 (정규화 Gram)
62번 Gram 행렬 은 내적 의 모든 쌍. 내적은 벡터 길이 에 영향받아 "긴 벡터끼리 더 유사"로 편향될 수 있습니다. 해결은 행 정규화:
Sij=∥xi∥∥xj∥xi⋅xj=cosθij
- S 의 값은 [−1,1], 대각은 1 (자기 자신과의 코사인).
- X~ 가 행별 L2-정규화된 X 면 S=X~X~⊤ — 정규화 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], 대각 = 1 (영벡터 아니라면).
- 영벡터 안전 처리: norm clip 으로 0 division 방지.
- 루프 금지.
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | shape (N, N) | |
| 2 | 대각 = 1 (영벡터 없으면) | |
| 3 | 대칭 | S == S.T |
| 4 | 값 범위 ⊂ [-1, 1] | |
| 5 | 스케일 불변 | S(αX) == S(X) |
| 6 | 루프 금지 | |