7.9 함수공간과 연산자

실습 · 연습문제 2개

RBF kernel ridge 회귀 kernel-ridge

1차원 입력 x1,…,xNx_1, \dots, x_N과 관측 y1,…,yNy_1, \dots, y_N이 있다. RBF 커널

k(x,x′)=exp⁡ ⁣(−(x−x′)22ℓ2)k(x, x') = \exp\!\left(-\frac{(x - x')^2}{2\ell^2}\right)

이 정하는 RKHS H\mathcal{H}에서 정규화된 최소제곱 문제

min⁡f∈H∑i=1N(yi−f(xi))2+λ∥f∥H2\min_{f \in \mathcal{H}} \sum_{i=1}^{N} \big(y_i - f(x_i)\big)^2 + \lambda \lVert f \rVert_{\mathcal{H}}^2

를 푼다. 표현자 정리에 따라 해는 f(x)=∑i=1Nαik(x,xi)f(x) = \sum_{i=1}^N \alpha_i k(x, x_i) 꼴이고, 계수는

(K+λI)α=y,Kij=k(xi,xj)(\mathbf{K} + \lambda \mathbf{I})\boldsymbol{\alpha} = \mathbf{y}, \qquad K_{ij} = k(x_i, x_j)

를 풀어 얻는다. 함수 kernel_ridge_predict(x_train, y_train, x_test, ell, lam)를 완성해 x_test의 각 점에서 ff의 값을 반환한다.

인자 shape 의미
x_train (N,) 학습 입력
y_train (N,) 학습 관측
x_test (M,) 예측할 입력
ell 스칼라 길이 척도 ℓ>0\ell > 0
lam 스칼라 정규화 강도 λ≥0\lambda \ge 0

반환값의 shape은 (M,)이다.

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

  • 위 닫힌 형태의 해와 같다.
  • λ\lambda가 아주 작으면 학습 점을 (거의) 지나간다.
  • 학습 점에서 멀리 떨어진 곳의 예측은 0에 가깝다. 해가 학습 점을 중심으로 한 커널 함수의 합이기 때문이다.
  • 예측은 y\mathbf{y}에 대해 선형이다.

힌트: 역행렬 np.linalg.inv보다 np.linalg.solve가 더 정확하고 빠르다. 쌍별 차이 (xi−xj′)(x_i - x'_j)는 broadcasting으로 한 번에 만든다(7.7장).

주기 격자 위의 미분 행렬 periodic-derivative-matrix

길이 LL인 주기 구간 [0,L)[0, L)을 NN칸으로 나눈 격자 xi=iL/Nx_i = iL/N, i=0,…,N−1i = 0, \dots, N-1 위에서, 함수 uu의 값 벡터 u=(u(x0),…,u(xN−1))\mathbf{u} = (u(x_0), \dots, u(x_{N-1}))에 미분 연산자 d/dxd/dx를 근사하는 행렬 D\mathbf{D}를 만든다. 중심 차분을 쓴다.

(Du)i=ui+1−ui−12h,h=LN.(\mathbf{D}\mathbf{u})_i = \frac{u_{i+1} - u_{i-1}}{2h}, \qquad h = \frac{L}{N}.

주기 경계이므로 인덱스는 NN을 법으로 돈다. u−1=uN−1u_{-1} = u_{N-1}, uN=u0u_N = u_0이다.

함수 central_diff_matrix(N, L)를 완성해 shape (N, N)인 NumPy 배열을 반환한다.

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

  • 상수 함수의 미분은 0이다.
  • D\mathbf{D}는 반대칭이다(D⊤=−D\mathbf{D}^\top = -\mathbf{D}). 연속 미분 연산자가 주기 함수의 L2L^2 내적에 대해 반대칭(⟨u′,v⟩=−⟨u,v′⟩\langle u', v\rangle = -\langle u, v'\rangle)인 성질을 물려받는다.
  • L≠2πL \neq 2\pi인 구간에서도 sin⁡(2πx/L)\sin(2\pi x / L)의 미분을 맞춘다.
  • NN을 두 배로 하면 오차가 약 4분의 1로 준다(2차 정확도).

힌트: 행렬은 거의 0이고, 행마다 두 원소만 0이 아니다. np.roll(np.eye(N), 1, axis=1)이 어떤 행렬인지 먼저 출력해 본다.