
Angular Distance (proper metric) [medium]
v1 코사인 유사도 와 코사인 거리 (1−cos) 는 삼각부등식 을 만족하지 않아 엄밀한 metric 이 아닙니다. Angular distance 는 각도 자체를 거리로 써서 이를 해결:
dθ(x,y)=πarccos(cos(x,y))∈[0,1]
- 같은 방향 → 0 (각도 0)
- 직교 → 0.5 (각도 π/2)
- 반대 방향 → 1 (각도 π)
왜 metric 인가
- 비음성, 대칭, 자기자신 = 0 ✓
- 삼각부등식: dθ(x,z)≤dθ(x,y)+dθ(y,z) ✓
- 코사인 거리는 삼각부등식 위반: 예) 30°+30° 거리가 60° 거리와 같지 않음 (각 아닌 1-cos 스케일).
수치 안정성
arccos(x) 는 x∈[−1,1] 만 정의됨. 부동소수 오차로 1.0000001 이 되면 NaN. clip 필수:
c = np.clip(dot / (nx * ny), -1.0, 1.0)
return np.arccos(c) / np.pi
과제
함수 angular_distance(x, y) 를 완성하세요.
- 1D 배열
x, y.
- 반환: Python
float ∈[0,1].
- 영벡터는 d=0.5 로 정의 (관례).
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | float 반환 | |
| 2 | 같은 방향 → 0 | |
| 3 | 반대 방향 → 1 | |
| 4 | 직교 → 0.5 | |
| 5 | [0, 1] 범위 | |
| 6 | 부동소수 안전 (동일 벡터 NaN 없음) | clip 필수 |
| 7 | 삼각부등식 만족 (random 3벡터) | |