Scikit learn 对于初学者来说,有没有简单的代码可以让我在scikit中实验高斯过程示例中使用的不同内核,从而了解它们的函数?

Scikit learn 对于初学者来说,有没有简单的代码可以让我在scikit中实验高斯过程示例中使用的不同内核,从而了解它们的函数?,scikit-learn,kernel,gaussian,Scikit Learn,Kernel,Gaussian,实际上,我想了解scikit学习高斯示例中使用的内核,但我对这些内核的行为以及何时使用这些内核一无所知,而且我也没有获得任何可以逐个使用这些内核并理解的基本模板代码示例。部分代码如下所示: X, y = load_mauna_loa_atmospheric_co2() 带有GPML手册中给出的参数的内核 k1 = 66.0**2 * RBF(length_scale=67.0) # long term smooth rising trend k2 = 2.4**2 * RBF(length_

实际上,我想了解scikit学习高斯示例中使用的内核,但我对这些内核的行为以及何时使用这些内核一无所知,而且我也没有获得任何可以逐个使用这些内核并理解的基本模板代码示例。部分代码如下所示:

X, y = load_mauna_loa_atmospheric_co2()
带有GPML手册中给出的参数的内核

k1 = 66.0**2 * RBF(length_scale=67.0)  # long term smooth rising trend
k2 = 2.4**2 * RBF(length_scale=90.0) \
    * ExpSineSquared(length_scale=1.3, periodicity=1.0)  # seasonal component
# medium term irregularity
k3 = 0.66**2 \
    * RationalQuadratic(length_scale=1.2, alpha=0.78)
k4 = 0.18**2 * RBF(length_scale=0.134) \
    + WhiteKernel(noise_level=0.19**2)  # noise terms
kernel_gpml = k1 + k2 + k3 + k4

gp = GaussianProcessRegressor(kernel=kernel_gpml, alpha=0,
                              optimizer=None, normalize_y=True)
gp.fit(X, y)

print("GPML kernel: %s" % gp.kernel_)
print("Log-marginal-likelihood: %.3f"
      % gp.log_marginal_likelihood(gp.kernel_.theta))

# Kernel with optimized parameters
k1 = 50.0**2 * RBF(length_scale=50.0)  # long term smooth rising trend
k2 = 2.0**2 * RBF(length_scale=100.0) \
    * ExpSineSquared(length_scale=1.0, periodicity=1.0,
                     periodicity_bounds="fixed")  # seasonal component
# medium term irregularities
k3 = 0.5**2 * RationalQuadratic(length_scale=1.0, alpha=1.0)
k4 = 0.1**2 * RBF(length_scale=0.1) \
    + WhiteKernel(noise_level=0.1**2,
                  noise_level_bounds=(1e-3, np.inf))  # noise terms
kernel = k1 + k2 + k3 + k4

gp = GaussianProcessRegressor(kernel=kernel, alpha=0,
                              normalize_y=True)
gp.fit(X, y)

print("\nLearned kernel: %s" % gp.kernel_)
print("Log-marginal-likelihood: %.3f"
      % gp.log_marginal_likelihood(gp.kernel_.theta))

X_ = np.linspace(X.min(), X.max() + 30, 1000)[:, np.newaxis]
y_pred, y_std = gp.predict(X_, return_std=True)

# Illustration
plt.scatter(X, y, c='k')
plt.plot(X_, y_pred)
plt.fill_between(X_[:, 0], y_pred - y_std, y_pred + y_std,
                 alpha=0.5, color='k')
plt.xlim(X_.min(), X_.max())
plt.xlabel("Year")
plt.ylabel(r"CO$_2$ in ppm")
plt.title(r"Atmospheric CO$_2$ concentration at Mauna Loa")
plt.tight_layout()
plt.show()

所有细节都在拉斯穆森和威廉姆斯的报告中。您展示的示例在第5章中给出,并详细解释了所使用的所有内核。它们还显示了协方差函数和相应的随机函数的许多示例

我不知道有哪种代码可以简单地可视化各种内核,但可以可视化流行的平方指数函数,它在Mauna Loa示例中多次出现,具有不同的长度刻度,如下所示:

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 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)

谢谢你的回复,但我已经翻开了那本书,但不了解高斯过程背后的数学内容,你有什么建议可以让我从哪里获得关于高斯的直觉,以及为什么我需要使用内核?建议我像一个12年级的学生。你是正确的GP书是在一个研究生的水平。教授全科医生并不是我非常了解的事情,但我可以建议两种方法来理解他们。一是熟悉该书的先决条件,如微积分、线性代数和概率论。另一种更为非正式的方式是从scikit学习一个例子,像这样学习:并获得对GP的操作理解。你可以从我上面的答案中解释不同长度的尺度来帮助你。我检查了这些,但是我想我需要一些初级水平的东西,因为根本没有任何基础。谢谢,顺便说一句