
v1 KNN 분류기 는 상위 k 이웃을 동등하게 1표씩. 가까운 이웃이 더 신뢰할 만한 정보를 주므로 거리 역수 로 가중치:
각 클래스 에 대해 이웃 중 인 것의 합산, 최대인 클래스 반환:
함수 knn_weighted(X_train, y_train, X_test, k, num_classes, eps=1e-8) 를 완성하세요.
(M,) 정수 레이블.# (M, N) 거리
D = np.sqrt(((X_test[:, None] - X_train[None]) ** 2).sum(-1))
idx = np.argpartition(D, k, axis=1)[:, :k] # (M, k)
dists = np.take_along_axis(D, idx, axis=1) # (M, k)
labels = y_train[idx] # (M, k)
w = 1.0 / (dists + eps) # (M, k)
# accumulate per class: for each m, for each c, sum w where label==c
votes = np.zeros((M, num_classes))
for c in range(num_classes):
votes[:, c] = ((labels == c) * w).sum(axis=1)
return votes.argmax(axis=1)
| # | 이름 | 검증 |
|---|---|---|
| 1 | shape (M,) | |
| 2 | 잘 분리 데이터 → 높은 정확도 | |
| 3 | 가까운 이웃 우선 (1/d 효과) | 동점 상황에서 가까운 쪽 승리 |
| 4 | X_test ⊂ X_train → 자기자신 라벨 | d=0 |
| 5 | k=1 → 단순 NN | 가중치 상관없음 |
| 6 | 2-class 손계산 |
코드를 작성하고 Run 을 눌러보세요.