Все подробности находятся в книге Расмуссена и Уильямса. Пример, который вы показываете, находится в Главе 5 вместе с подробным объяснением всех используемых ядер. Они также показывают много примеров ковариационных функций и соответствующих случайных функций.
Мне неизвестен код для простой визуализации различных ядер, но можно визуализировать популярную квадратную экспоненциальную функцию, которая несколько раз появляется в примере с Мауна-Лоа с разными шкалами длины, как показано ниже:
import numpy as np
import matplotlib.pyplot as plt
def k_se(r,l):
return np.exp(-r*r/(2*l*l))
r = np.arange(0.1,4,0.01)
plt.figure()
for ll in l:
plt.plot(r,k_se(r,ll),label='length='+str(np.round(ll,1)))
plt.xlabel('r')
plt.ylabel('Covariance k(r)')
plt.legend(frameon=False)
Различные ядра для разных масштабов длины выглядят так:
Однако, что более интересно, это рисование случайных функций из гауссовского процесса, который дал ковариационную функцию. Следующий код предназначен не для эффективности или скорости, а для упрощения визуализации этих случайных функций.
def k_se_p(x1, x2, l):
return np.exp(-((x1-x2)*(x1-x2))/(2*l*l))
def gm(x,l):
return [[k_se_p(i,j,l) for j in x] for i in x]
x = np.arange(0.1,8,0.01)
Поучительно сначала нарисовать функции из той же шкалы длины:
plt.figure()
for i in range(5):
ys = np.random.multivariate_normal(np.zeros(len(x)), gm(x,l[0]))
if i==0:
plt.plot(x,ys,color='blue',label='length='+str(np.round(l[0],1)))
else:
plt.plot(x,ys,color='blue')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend(frameon=False)
Что дает не очень плавные функции:
Увеличенная шкала длины обеспечивает более плавные функции:
plt.figure()
for i in range(5):
ys = np.random.multivariate_normal(np.zeros(len(x)), gm(x,l[-1]))
if i==0:
plt.plot(x,ys,color='magenta',label='length='+str(np.round(l[-1],1)))
else:
plt.plot(x,ys,color='magenta')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend(frameon=False)
Наконец, мы можем извлечь одну функцию из каждого Длина шкалы и график их вместе:
plt.figure()
for ll in l:
ys = np.random.multivariate_normal(np.zeros(len(x)), gm(x,ll))
plt.plot(x,ys,label='length='+str(np.round(ll,1)))
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend(frameon=False)