← 문제 목록/Distance-weighted KNN Classifier [medium]
문제 해설

Distance-weighted KNN Classifier [medium]

분류 · medium

preview

Distance-weighted KNN Classifier [medium]

v1 KNN 분류기 는 상위 k 이웃을 동등하게 1표씩. 가까운 이웃이 더 신뢰할 만한 정보를 주므로 거리 역수 로 가중치:

wj=1dj+ϵw_j = \frac{1}{d_j + \epsilon}

각 클래스 cc 에 대해 jj 이웃 중 yj=cy_j = c 인 것의 wjw_j 합산, 최대인 클래스 반환:

y^=argmaxcjtop-k,yj=cwj\hat y = \arg\max_c \sum_{j \in \text{top-}k, \, y_j = c} w_j

왜 좋은가

  • 먼 이웃의 투표가 묽어짐 → 가까운 이웃 우선.
  • kk 가 크더라도 멀리 있는 불필요한 이웃 영향 줄임.
  • d=0d = 0 (동일 점) 은 ϵ\epsilon 으로 무한대 방지.

과제

함수 knn_weighted(X_train, y_train, X_test, k, num_classes, eps=1e-8) 를 완성하세요.

  • 예측별 거리 계산 → 상위 k → 가중 투표.
  • 반환: (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)

테스트 케이스

#이름검증
1shape (M,)
2잘 분리 데이터 → 높은 정확도
3가까운 이웃 우선 (1/d 효과)동점 상황에서 가까운 쪽 승리
4X_test ⊂ X_train → 자기자신 라벨d=0
5k=1 → 단순 NN가중치 상관없음
62-class 손계산
코드 작성
Loading...
실행 결과

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