高斯过程分类

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验展示了如何在 Python 的 scikit-learn 库中使用高斯过程分类(GPC)。目的是展示如何训练和测试 GPC 模型、绘制等概率线以及评估分类性能。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入所需库

首先,我们需要导入所需的库。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import DotProduct, ConstantKernel as C

准备数据

我们将生成一些用于分类的合成数据。要分类的函数定义如下:

def g(x):
    """要预测的函数(分类将在于预测 g(x) <= 0 是否成立)"""
    return 5.0 - x[:, 1] - 0.5 * x[:, 0] ** 2.0

然后,我们需要创建实验设计和观测值。

## 一些常量
lim = 8

## 实验设计
X = np.array(
    [
        [-4.61611719, -6.00099547],
        [4.10469096, 5.32782448],
        [0.00000000, -0.50000000],
        [-6.17289014, -4.6984743],
        [1.3109306, -6.93271427],
        [-5.03823144, 3.10584743],
        [-2.87600388, 6.74310541],
        [5.21301203, 4.26386883],
    ]
)

## 观测值
y = np.array(g(X) > 0, dtype=int)

训练模型

我们将使用高斯过程分类(GPC)模型对数据进行分类。首先,我们需要指定核函数。

kernel = C(0.1, (1e-5, np.inf)) * DotProduct(sigma_0=0.1) ** 2

然后,我们可以创建一个 GPC 模型并使用数据对其进行训练。

gp = GaussianProcessClassifier(kernel=kernel)
gp.fit(X, y)

评估模型

我们将评估训练好的高斯过程分类(GPC)模型的分类性能。我们将生成一个点网格,并使用训练好的模型计算每个点的预测概率。

## 评估真实函数和预测概率
res = 50
x1, x2 = np.meshgrid(np.linspace(-lim, lim, res), np.linspace(-lim, lim, res))
xx = np.vstack([x1.reshape(x1.size), x2.reshape(x2.size)]).T

y_true = g(xx)
y_prob = gp.predict_proba(xx)[:, 1]
y_true = y_true.reshape((res, res))
y_prob = y_prob.reshape((res, res))

绘制结果

我们将绘制高斯过程分类(GPC)模型的等概率线和分类边界。

## 绘制概率分类等值线
fig = plt.figure(1)
ax = fig.gca()
ax.axes.set_aspect("equal")
plt.xticks([])
plt.yticks([])
ax.set_xticklabels([])
ax.set_yticklabels([])
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")

cax = plt.imshow(y_prob, cmap=cm.gray_r, alpha=0.8, extent=(-lim, lim, -lim, lim))
norm = plt.matplotlib.colors.Normalize(vmin=0.0, vmax=0.9)
cb = plt.colorbar(cax, ticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0], norm=norm)
cb.set_label(r"${\rm \mathbb{P}}\left[\widehat{G}(\mathbf{x}) \leq 0\right]$")
plt.clim(0, 1)

plt.plot(X[y <= 0, 0], X[y <= 0, 1], "r.", markersize=12)

plt.plot(X[y > 0, 0], X[y > 0, 1], "b.", markersize=12)

plt.contour(x1, x2, y_true, [0.0], colors="k", linestyles="dashdot")

cs = plt.contour(x1, x2, y_prob, [0.666], colors="b", linestyles="solid")
plt.clabel(cs, fontsize=11)

cs = plt.contour(x1, x2, y_prob, [0.5], colors="k", linestyles="dashed")
plt.clabel(cs, fontsize=11)

cs = plt.contour(x1, x2, y_prob, [0.334], colors="r", linestyles="solid")
plt.clabel(cs, fontsize=11)

plt.show()

总结

在本实验中,我们学习了如何在 Python 的 scikit-learn 库中使用高斯过程分类(GPC)。我们展示了如何训练和测试一个 GPC 模型、绘制等概率线以及评估分类性能。