GPy의 커널 함수 비교

목적
최적화로 GPy의 방사기저함수 RBF(Radial Basis Function)를 이용한 사례를 인터넷에서 잘 볼 수 있지만, 그 밖에도 복수의 커널함수가 있다. 이러한 함수의 수학적 설명은 있어도 구분을 모르기 때문에, 1차원의 디폴트 설정으로, 그래프 표시해 비교해 보았다.
덧붙여 Some experiments in Gaussian Processes Regression 의 스크립트를 참고로 작성했다. 안직하게 커널 함수를 병렬로 기술해 보았을 뿐이다.

 
환경


아이템
콘텐츠


Hardware
Jetson Nano

SDK
Jetpack 4.2.3

OS
우분투 18.04

파이썬
Ver. 3.6.9

GPy
Ver. 1.9.9

matplotlib
Ver. 3.2.2

numpy
Ver. 1.19.2


스크립트
# Support for maths
import numpy as np
# Plotting tools
from matplotlib import pyplot as plt
# we use the following for plotting figures in jupyter
#%matplotlib inline  #Jupyter notebook使用時

import warnings
warnings.filterwarnings('ignore')

# GPy: Gaussian processes library
import GPy
#from IPython.display import display

# Create a 1-D RBF kernel with default parameters
k01 = GPy.kern.RBF(1)
k02 = GPy.kern.Matern32(1)
k03 = GPy.kern.Matern52(1)
k04 = GPy.kern.ExpQuad(1)
k05 = GPy.kern.RatQuad(1)
k06 = GPy.kern.Exponential(1)
k07 = GPy.kern.Cosine(1)
k08 = GPy.kern.White(1)
k09 = GPy.kern.Linear(1)
k10 = GPy.kern.sde_Brownian(1)
k11 = GPy.kern.Integral(1)
k12 = GPy.kern.Poly(1)
k13 = GPy.kern.Bias(1)
k14 = GPy.kern.StdPeriodic(1)
k15 = GPy.kern.PeriodicExponential(1)

# Our sample space: 100 samples in the interval [-4,4]
X = np.linspace(-4.,4.,100)[:, None] # we need [:, None] to reshape X into a column vector for use in GPy

# First, sample kernel at x' = 0
K01 = k01.K(X, np.array([[0.]])) # k(x,0)
K02 = k02.K(X, np.array([[0.]])) # k(x,0)
K03 = k03.K(X, np.array([[0.]])) # k(x,0)
K04 = k04.K(X, np.array([[0.]])) # k(x,0)
K05 = k05.K(X, np.array([[0.]])) # k(x,0)
K06 = k06.K(X, np.array([[0.]])) # k(x,0)
K07 = k07.K(X, np.array([[0.]])) # k(x,0)
K08 = k08.K(X, np.array([[0.]])) # k(x,0)
K09 = k09.K(X, np.array([[0.]])) # k(x,0)
K10 = k10.K(X, np.array([[0.]])) # k(x,0)
K11 = k11.K(X, np.array([[0.]])) # k(x,0)
K12 = k12.K(X, np.array([[0.]])) # k(x,0)
K13 = k13.K(X, np.array([[0.]])) # k(x,0)
K14 = k14.K(X, np.array([[0.]])) # k(x,0)
K15 = k15.K(X, np.array([[0.]])) # k(x,0)

plt.axes([0.1, 0.1, 0.6, 0.8])

plt.plot(X, K01, label="RBF")
plt.plot(X, K02, label="Matern32")
plt.plot(X, K03, label="Matern52")
plt.plot(X, K04, label="ExpQuad")
plt.plot(X, K05, label="RatQuad")
plt.plot(X, K06, label="Exponential")
plt.plot(X, K07, label="Cosine")
plt.plot(X, K08, label="White")
plt.plot(X, K09, label="Linear")
plt.plot(X, K10, label="sde_Brownian")
plt.plot(X, K11, label="Integral")
plt.plot(X, K12, label="Poly")
plt.plot(X, K13, label="Bias")
plt.plot(X, K14, label="StdPeriodic")
plt.plot(X, K15, label="PeriodicExponential")

plt.title("$\kappa_{Covariance Function}(x,x')$");
plt.legend(bbox_to_anchor=(1.05,1), loc='upper left', borderaxespad=0, fontsize=8)
plt.show()

설명
16~30행 : Gpy의 공식 설명 에서, "covariance function"을 키워드로 검색해, 동작할 것 같은 메소드를 1차원으로 정의.
52행 : 그래프(Axes)의 범위를 좌하(0.1,0.1), 우상(0.6,0.8)으로 설정.
71행 : bbox_to_anchor=(1.05,1)에서 범례의 위치를 ​​오른쪽 상단에, borderaxespad=0으로 범례를 그래프 밖에 배치한다. bbox_to_anchor=(1,1)로 그래프(axes)의 우상단과 일치한다.

결과

            도 1
도 1 중, X = 0에서 Y = 1 부근에 피크를 갖고 가우스 분포에 가까운 것을도 2에 표시한다.

            도 2
Exponential이 가장 날카로운 함수이지만, 그 이외는 닮았기 때문에, X=±2 부근을 경계로 해, 0 부근에의 집중도에 차이가 있다.

개인적인 결론
일단 RBF로 최적화의 프레임워크를 구축해, 그 프레임워크에서의 동작 결과를 몇번인가 확인하면서, 경우에 따라서는 적절히 커널 함수를 변경하는 진행 방법이 좋은 것 같다.

좋은 웹페이지 즐겨찾기