16.3 커널 방법과 최근접 이웃

실습 · 연습문제 2개

표준화를 포함한 kNN 회귀 knn-standardized

함수 knn_predict(X_train, y_train, X_test, k)를 완성해, 시험 입력마다 kNN 회귀 예측을 담은 shape (M,) 배열을 반환한다.

  1. 학습 데이터의 특징별 평균 μj\mu_j와 표준편차 sjs_j(ddof=0)로 학습 입력과 시험 입력을 모두 표준화한다. 시험 데이터의 통계량을 쓰면 누수다.
  2. 표준화된 공간에서 시험 점마다 모든 학습 점까지의 Euclid 거리를 계산한다.
  3. 가장 가까운 학습 점 kk개의 y_train 평균을 예측으로 쓴다.
인자 shape
X_train (N, p)
y_train (N,)
X_test (M, p)

힌트: 거리 행렬은 브로드캐스팅으로 (M, N) 배열 하나로 만들 수 있다. 가장 작은 kk개의 인덱스는 np.argsort나 np.argpartition으로 찾는다.

테스트는 다음을 확인한다.

  • k = 1이면 학습 입력에서의 예측이 학습 출력과 같다.
  • k = N이면 모든 예측이 y_train의 평균이다.
  • 한 특징의 단위를 1000배 바꿔도 예측이 같다(표준화했으므로).
  • 숫자가 큰 무관한 특징이 있어도 표준화 덕분에 중요한 특징을 쓴다.
  • 직접 계산한 작은 예와 같다.

RBF 커널의 random Fourier features random-fourier-features

RBF 커널

k(x,x′)=exp⁡ ⁣(−∥x−x′∥22ℓ2)k(\mathbf{x}, \mathbf{x}') = \exp\!\Big(-\frac{\lVert\mathbf{x} - \mathbf{x}'\rVert^2}{2\ell^2}\Big)

은 mm개의 무작위 특징으로 근사할 수 있다(Rahimi & Recht, 2007). ωj∼N(0,ℓ−2I)\boldsymbol\omega_j \sim \mathcal{N}(\mathbf{0}, \ell^{-2}\mathbf{I})와 bj∼U(0,2π)b_j \sim \mathrm{U}(0, 2\pi)를 j=1,…,mj = 1, \dots, m에 대해 뽑고

zj(x)=2mcos⁡(ωj⊤x+bj)z_j(\mathbf{x}) = \sqrt{\tfrac{2}{m}}\cos(\boldsymbol\omega_j^\top\mathbf{x} + b_j)

로 두면, z(x)⊤z(x′)\mathbf{z}(\mathbf{x})^\top\mathbf{z}(\mathbf{x}')의 기댓값이 정확히 k(x,x′)k(\mathbf{x}, \mathbf{x}')이고, mm이 커질수록 오차가 O(1/m)O(1/\sqrt{m})로 줄어든다.

함수 random_fourier_features(X, m, length_scale, seed=0)를 완성해 shape (N, m)의 특징 행렬 Z를 반환한다. X의 shape은 (N, d)다.

  • 난수는 rng = np.random.default_rng(seed) 하나로 만든다. 같은 seed면 같은 특징을 내야 한다.
  • 같은 seed로 다른 입력 집합을 변환하면 같은 ω,b\boldsymbol\omega, b를 써야 한다. 학습 데이터와 시험 데이터를 같은 특징 공간에 놓기 위해서다. ω는 (d, m), b는 (m,) 순서로 뽑는다.

테스트는 다음을 확인한다.

  • shape과 재현성.
  • ZZ⊤\mathbf{Z}\mathbf{Z}^\top이 RBF Gram 행렬에 가깝고, 특징 수를 늘리면 오차가 줄어든다.
  • 길이 척도를 바꾸면 근사하는 커널도 바뀐다.
  • 대각 성분 z(x)⊤z(x)\mathbf{z}(\mathbf{x})^\top\mathbf{z}(\mathbf{x})는 평균적으로 k(x,x)=1k(\mathbf{x}, \mathbf{x}) = 1에 가깝다.