高斯过程的数学理解

目录

一、说明

二、初步:多元高斯分布

三、 线性回归模型与维度的诅咒

四、高斯过程的数学背景

五、高斯过程的应用:高斯过程回归

5.1 如何拟合和推理高斯过程模型

5.2 示例:一维数据的高斯过程模型

5.3 示例:多维数据的高斯过程模型

六、引用


照片由 理查德·霍瓦特 on Unsplash

一、说明

        G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

二、初步:多元高斯分布

        多元高斯分布是理解高斯过程的必要概念之一。让我们快速回顾一下。如果您熟悉多元高斯分布,则可以跳过此部分。

        多元高斯分布是具有两个以上维度的高斯分布的联合概率。多元高斯分布的概率密度函数如下。

        多元高斯分布的概率密度函数

        x 是具有 D × 1 维的输入数据,μ 是与 x 具有相同维数的平均向量,Σ 是具有 D × D 维的协方差矩阵。

        多元高斯分布具有以下重要特征。

  1. 多元高斯分布的边际分布仍然遵循高斯分布
  2. 多元高斯分布的条件分布仍然遵循高斯分布

        让我们通过可视化来检查这些概念。我们假设 D 维数据服从高斯分布。

        对于特征 1,当我们将输入数据维数 D 划分为第一个 L 和其他 D-L=M 维时,我们可以将高斯分布描述如下。

        分离多元高斯分布

        然后,当我们边缘化 x₂ 的分布时,x₁ 的概率分布可以写成:

二维高斯分布的边际分布

        根据公式(1),我们可以在边缘化其他变量时取消它们。该图显示了二维高斯分布情况。正如你所看到的,边缘化的分布映射到每个轴;它的形式是高斯分布。直观地说,当我们根据一个轴切割多元高斯分布时,横截面的分布仍然遵循高斯分布。您可以查看参考文献 [2] 以获取详细推导。

        对于特征 2,我们使用相同的 D 维多元高斯分布和二分输入数据 x₁ 和 x₂。多元高斯分布的条件概率可以写成:

二维高斯分布的条件分布

该图显示了二维高斯分布(等值线)和条件高斯分布(虚线)。高斯分布的形状在每种条件下都不同。您可以查看参考文献 [2] 以获取详细推导。

三、 线性回归模型与维度的诅咒

在深入研究高斯过程之前,我想澄清线性回归模型及其缺点或维数的诅咒。高斯过程与这个概念密切相关,可以克服其缺点。如果本章响起,您可以跳过本章。

让我们回顾一下线性回归模型。线性回归模型可以使用基函数 φ(x) 灵活地表达数据。

线性回归模型的公式

对于基函数,我们可以使用非线性函数,例如多项式项或余弦函数。因此,线性回归模型可以通过将非线性基函数应用于 x 来掌握非线性关系。下图显示了我们使用径向基函数时的示例情况。

具有径向基函数的线性回归模型

如您所见,它可以掌握复杂的数据结构。我们仍然称它为线性回归模型,因为从参数 w 的角度来看,这个方程仍然满足线性关系。您可以检查参数是否没有非线性表达式。

我们也可以用与多元线性回归相同的方式推导参数。以下方程是线性回归模型的矩阵和线性代数形式。我们假设有 N 个数据点和 p+1 参数。

线性回归模型的矩阵形式

线性回归模型的线性代数形式

请注意,矩阵 Φ 值在我们对每个输入数据应用基函数后成为常数。它不是类似于多元线性回归吗?实际上,参数的解析推导是相同的。

线性回归模型与多元线性回归的参数推导

线性回归模型在公式 (4) 中假设一个自变量存在缺陷。因此,当输入数据维度的数量增加时,参数的数量会呈指数增长。如果我们添加基函数的数量,我们可以获得模型的灵活性,但计算量会不切实际地增加。这个问题被称为维度的诅咒。有没有办法在不增加计算量的情况下提高模型的灵活性?是的,我们应用高斯过程定理。让我们进入下一节,看看什么是高斯过程。

四、高斯过程的数学背景

我们已经看到,当参数数量增加时,线性回归模型存在维数诅咒的问题。这个问题的解决方案是对参数进行期望,并创建一个不需要参数来计算的情况。这是什么意思?请记住,线性回归模型公式如下。

线性回归模型的线性代数形式

现在,当我们假设参数 w 遵循高斯分布时,输出 y 将遵循高斯分布,因为矩阵 Φ 只是恒定值矩阵。我们假设该参数遵循下面的高斯分布:

该参数遵循定义的高斯分布

基于此,我们可以按如下方式计算输出分布的参数:

输出分布参数的推导

输出 y 的分布

正如你所看到的,我们可以通过取其期望来抵消参数计算。因此,即使我们有无限的参数,它们也不会影响计算。x 和 y 之间的这种关系遵循高斯过程。高斯过程定义为:

高斯过程的定义

直观地说,高斯过程是具有无限多个参数的多元高斯分布。公式(7)是指给定数据对高斯过程的边际高斯分布。它源于边际多元高斯分布仍然遵循高斯分布的特征。因此,通过充分利用高斯过程,可以在考虑无限维参数的同时构建模型。

这里还有一个问题,我们如何选择矩阵Φ?当我们关注上述公式的协方差矩阵部分并将其设置为 K 时,每个元素可以写成:

公式 (7) 的协方差矩阵

根据公式(9),协方差矩阵的每个元素都是φ(习)和φ(xj)的内积的常数倍数。由于内积类似于余弦相似性,因此当 习 和 xj 相似时,公式 (9) 的值变大。

为了满足协方差矩阵的对称性和正定性且具有逆矩阵的特征,我们需要适当地选择φ(x)。为了实现它们,我们利用 φ(x) 的内核函数。

内核函数

使用核函数的一个好处是,我们可以通过核函数获得 φ(x) 的内积,而无需显式计算 φ(x)。这种技术称为内核技巧。你可以查看这个优秀的博客 [3] 来详细解释内核技巧。最常用的内核函数如下所示。

  • 高斯核

高斯核函数

  • 线性内核

线性核函数

  • 周期性内核

周期性内核

可视化显示了使用每个内核的一维高斯过程的采样。您可以看到内核的功能。

现在,让我们回顾一下高斯过程。使用内核函数,我们可以将定义重写为:

高斯过程的数学定义

当 f 的每个元素都遵循高斯过程(即无限高斯分布)时,f 的联合概率遵循多元高斯分布。

在下一节中,我们将讨论高斯过程或高斯过程回归模型的应用。

五、高斯过程的应用:高斯过程回归

在最后一节中,我们将高斯过程应用于回归。我们将看到下面的主题。

  • 如何拟合和推理高斯过程模型
  • 示例:一维数据的高斯过程模型
  • 示例:多维数据的高斯过程模型

5.1 如何拟合和推理高斯过程模型

让我们有 N 个输入数据 x 和相应的输出 y

输入数据 x 和相应的输出 y

为简单起见,我们对输入数据 x 进行归一化以进行预处理,这意味着 x 的平均值为 0。如果我们在 x 和 y 之间有以下关系,并且 f 遵循高斯过程。

x 和 y 之间的关系以及高斯过程设置

因此,输出 y 遵循以下多元高斯分布。

高斯过程回归模型

为了拟合,我们只需通过核函数计算协方差矩阵,并将输出 y 分布的参数确定为正好为 1。因此,除了核函数的超参数之外,高斯过程没有训练阶段。

推理阶段怎么样?由于高斯过程没有像线性回归模型那样的权重参数,我们需要再次拟合包括新数据。但是,我们可以使用多元高斯分布的特征来节省计算量。

让我们有 m 个新数据点。

新数据集

在这种情况下,分布(包括新数据点)也遵循高斯分布,因此我们可以将其描述如下:

包含新数据点的新发行版

请记住公式(2),条件多元高斯分布的参数。

条件多元高斯分布的参数

当我们将此公式应用于公式 (11) 时,参数如下:

高斯过程回归的更新公式

这是高斯过程回归模型的更新公式。当我们想从中取样时,我们使用从 Cholesky 分解导出的下三角矩阵。

多元高斯分布的采样方法

您可以查看 [4] 中的详细理论解释。但是,在实际情况下,您不需要从头开始实现高斯过程回归,因为 Python 中已经有很好的库。

在下面的小节中,我们将学习如何使用 Gpy 库实现高斯过程。您可以通过 pip 轻松安装它。

5.2 示例:一维数据的高斯过程模型

我们将使用一个玩具示例数据,该数据由具有高斯噪声的 sin 函数生成。

# Generate the randomized sampleX = np.linspace(start=0, stop=10, num=100).reshape(-1, 1)
y = np.squeeze(X * np.sin(X)) + np.random.randn(X.shape[0])
y = y.reshape(-1, 1)

玩具示例

我们使用 RBF 内核是因为它非常灵活且易于使用。多亏了 GPy,我们只需几行即可声明 RBF 核和高斯过程回归模型。

# RBF kernel
kernel = GPy.kern.RBF(input_dim=1, variance=1., lengthscale=1.)# Gaussian process regression using RBF kernel
m = GPy.models.GPRegression(X, y, kernel)

使用高斯过程回归模型的拟合分布

x 点表示输入数据,蓝色曲线表示该点高斯过程回归模型的期望值,浅蓝色阴影区域表示 95% 置信区间。

如您所见,具有多个数据点的区域具有较浅的置信区间,但具有几个点的区域具有较宽的区间。因此,如果你是制造业的工程师,你可以知道你在哪里没有足够的数据,但数据区域(或实验条件)有可能有目标值。

5.3 示例:多维数据的高斯过程模型

我们将使用 scikit-learn 示例数据集中的糖尿病数据集。

# Load the diabetes dataset and create a dataframe
diabetes = datasets.load_diabetes()
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

这个数据集已经过预处理(归一化),所以我们可以直接实现高斯过程回归模型。我们也可以将同一个类用于多个输入。

# dataset
X = df[['age', 'sex', 'bmi', 'bp']].values
y = df[['target']].values# set kernel
kernel = GPy.kern.RBF(input_dim=4, variance=1.0, lengthscale=1.0, ARD = True)# create GPR model
m = GPy.models.GPRegression(X, y, kernel = kernel) 

结果如下表所示。

包含输入变量和目标变量的结果表

如您所见,还有很大的改进空间。改进预测结果的最简单步骤是收集更多数据。如果不可能,您可以更改内核的选择或超参数优化。我稍后会粘贴我使用的代码,所以请随意更改和播放它!

您可以使用以下代码重现可视化和 GPy 实验。

我们已经讨论了数学定理和高斯过程的实际实现。当您拥有少量数据时,此技术非常有用。但是,由于计算量取决于数据的数量,请记住它不适合大数据。感谢您的阅读!

六、引用

[1] Mochihashi, D., Oba, S., ガウス過程と機械学習, 講談社

[2]多元正态distribution.pdf的 https://www.khoury.northeastern.edu/home/vip/teach/MLcourse/3_generative_models/lecture_notes/Marginal 分布和条件分布

[3] Hui, J., 机器学习内核, Medium

[4] RPubs - Sampling from Multivariate Normal Random Variable

Mathematical understanding of Gaussian Process | by Yuki Shizuya | The Quantastic Journal | Jun, 2024 | Medium

七、代码参考



import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from scipy.stats import norm, multivariate_normal
from sklearn.linear_model import LinearRegression
from sklearn import datasets

import GPy

Linear data

In [15]:

n_samples = 30w0 = 2.0
w1 = 4.5x = np.sort(np.random.rand(n_samples))
y = w1 * x + w0 + np.random.rand(n_samples)x = x.reshape(-1, 1)
y = y.reshape(-1, 1)lr = LinearRegression()
lr.fit(x, y)print('coefficient:', lr.coef_)
print('intercept:', lr.intercept_)fig, ax = plt.subplots(1, 2, figsize=(10, 5))ax[0].scatter(x, y, color='blue', label='input data')
ax[0].set_xlabel('x')
ax[0].set_ylabel('y')ax[1].scatter(x, y, color='blue', label='input data')
ax[1].plot(x, lr.predict(x), color='black', label='linear regression line')
ax[1].set_xlabel('x')
ax[1].set_ylabel('y')
ax[1].legend()
plt.show()
coefficient: [[4.60793678]]
intercept: [2.38216139]

Non-linear data

In [18]:

n_samples = 30x = np.sort(np.random.rand(n_samples))
y = np.sin(2.0 * np.pi * x) + np.random.rand(n_samples)x = x.reshape(-1, 1)
y = y.reshape(-1, 1)lr = LinearRegression()
lr.fit(x, y)print('coefficient:', lr.coef_)
print('intercept:', lr.intercept_)fig, ax = plt.subplots(1, 2, figsize=(10, 5))ax[0].scatter(x, y, color='blue', label='input data')
ax[0].set_xlabel('x')
ax[0].set_ylabel('y')ax[1].scatter(x, y, color='blue', label='input data')
ax[1].plot(x, lr.predict(x), color='black', label='linear regression line')
ax[1].set_xlabel('x')
ax[1].set_ylabel('y')
ax[1].legend()plt.show()
coefficient: [[-2.12667242]]
intercept: [1.5927719]

Radial basis function regression

In [22]:

# the mu values for radial basis function
mus = np.array([i for i in range(-4, 4, 1)])# 1-D input data
x = np.linspace(-5, 5, 500)# for visualization
fig, ax = plt.subplots(1, 1)# calculate the pdf of each mu
for mu in mus:rv = norm(loc=mu, scale=1.0)ax.plot(x, rv.pdf(x), color='blue')ax.set_xlabel('x')
ax.set_title('Radial basis function (1 dimension)')
plt.show()

In [33]:

# the mu values for radial basis function
mus = np.array([i for i in range(-4, 5, 1)])# weights for the spline function
weights = np.array([-0.48, -0.52, 0.1, -0.9, 0.23, 0.57, 0.28, -0.69, 0.46])# 1-D input data
x = np.linspace(-5, 5, 500)y = np.zeros(x.shape)for i in range(len(x)):for j in range(len(weights)):y[i] += weights[j] * np.exp(-(x[i]-mus[j])**2)# for visualization
fig, ax = plt.subplots(1, 1)
ax.plot(x, y, color='black')
ax.set_xlabel('x')
ax.set_title('Radial basis function regression')
plt.grid()
plt.show()

Merginal distribution visualization

In [25]:

# Marginal distributionmus = [[0, 0] for _ in range(3)]
covs = [[[1, 0.2], [0.2, 1]], [[1, 0.5], [0.5, 1]], [[1, 0.8], [0.8, 1]]]fig, ax = plt.subplots(1, 3, figsize=(15, 5))max_val = 3
min_val = -3N = 200
x = np.linspace(min_val, max_val, N)
y = np.linspace(min_val, max_val, N)
X, Y = np.meshgrid(x, y)pos  = np.dstack((X, Y))for i in range(3):mu = mus[i]cov = covs[i]rv   = multivariate_normal(mu, cov)Z    = rv.pdf(pos)ax[i].contour(X, Y, Z)ax[i].set_aspect('equal', adjustable='box')rv1 = norm(mu[0], cov[0][0])z1 = rv1.pdf(x)ax[i].plot(x, z1-max_val)rv2 = norm(mu[1], cov[1][1])z2 = rv2.pdf(y)ax[i].plot(z2-max_val, y)ax[i].set_xticks([])ax[i].set_yticks([])plt.grid()
plt.show()

Conditional distribution visualization

In [40]:

# Conditional distributionmus = [0, 0]
covs = [[1, 0.8], [0.8, 1]]fig, ax = plt.subplots(1, 1)max_val = 3
min_val = -3N = 200
x = np.linspace(min_val, max_val, N)
y = np.linspace(min_val, max_val, N)
X, Y = np.meshgrid(x, y)pos  = np.dstack((X, Y))
rv   = multivariate_normal(mu, cov)
Z    = rv.pdf(pos)ax.contour(X, Y, Z)
ax.set_aspect('equal', adjustable='box')for c in [-1.5, 0, 1.5]:cond_mu = mu[1] + covs[1][0] * (1 / covs[0][0]) * (c - mu[0])cond_cov = covs[1][1] - covs[1][0] * (1 / covs[0][0]) * covs[0][1]rv1 = norm(cond_mu, cond_cov)z1 = rv1.pdf(x)ax.plot(z1+c, x, '--', color='black')ax.plot([c for _ in range(len(y))], y, color='black')plt.grid()
plt.show()

Sampling from Gaussain process using various kernel funcions

In [42]:

import matplotlib.pyplot as plt
import numpy as npdef plot_gpr_samples(gpr_model, n_samples, ax):"""Borrow from https://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gpr_prior_posterior.htmlPlot samples drawn from the Gaussian process model.If the Gaussian process model is not trained then the drawn samples aredrawn from the prior distribution. Otherwise, the samples are drawn fromthe posterior distribution. Be aware that a sample here corresponds to afunction.Parameters----------gpr_model : `GaussianProcessRegressor`A :class:`~sklearn.gaussian_process.GaussianProcessRegressor` model.n_samples : intThe number of samples to draw from the Gaussian process distribution.ax : matplotlib axisThe matplotlib axis where to plot the samples."""x = np.linspace(0, 5, 100)X = x.reshape(-1, 1)y_mean, y_std = gpr_model.predict(X, return_std=True)y_samples = gpr_model.sample_y(X, n_samples)for idx, single_prior in enumerate(y_samples.T):ax.plot(x,single_prior,linestyle="--",alpha=0.7,label=f"Sampled function #{idx + 1}",)ax.plot(x, y_mean, color="black", label="Mean")ax.fill_between(x,y_mean - y_std,y_mean + y_std,alpha=0.1,color="black",label=r"$\pm$ 1 std. dev.",)ax.set_xlabel("x")ax.set_ylabel("y")ax.set_ylim([-3, 3])

Example dataset to visualize sampling values from various kernels

In [56]:

rng = np.random.RandomState(4)
X_train = rng.uniform(0, 5, 10).reshape(-1, 1)
y_train = np.sin((X_train[:, 0] - 2.5) ** 2)
n_samples = 5

In [63]:

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel, DotProduct, ExpSineSquared

In [59]:

# Linear kernelkernel = (ConstantKernel(0.1, (0.01, 10.0)) + DotProduct(sigma_0=0)
)
gpr = GaussianProcessRegressor(kernel=kernel, random_state=0)fig, axs = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(10, 8))# plot prior
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[0])
axs[0].set_title("Samples from Gaussian process using linear kernel")# plot posterior
gpr.fit(X_train, y_train)
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[1])
axs[1].scatter(X_train[:, 0], y_train, color="red", zorder=10, label="Observations")
axs[1].legend(bbox_to_anchor=(1.05, 1.5), loc="upper left")
axs[1].set_title("Samples from posterior distribution")fig.suptitle("Dot-product kernel", fontsize=18)
plt.tight_layout()
/opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/sklearn/gaussian_process/kernels.py:284: RuntimeWarning: divide by zero encountered in logreturn np.log(np.hstack(theta))
/opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/sklearn/gaussian_process/_gpr.py:659: ConvergenceWarning: lbfgs failed to converge (status=2):
ABNORMAL_TERMINATION_IN_LNSRCH.Increase the number of iterations (max_iter) or scale the data as shown in:https://scikit-learn.org/stable/modules/preprocessing.html_check_optimize_result("lbfgs", opt_res)
/opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/sklearn/gaussian_process/kernels.py:419: ConvergenceWarning: The optimal value found for dimension 0 of parameter k2__sigma_0 is close to the specified lower bound 1e-05. Decreasing the bound and calling fit again may find a better value.warnings.warn(

In [61]:

# Gaussian kernelkernel = 1.0 * RBF(length_scale=1.0, length_scale_bounds=(1e-1, 10.0))
gpr = GaussianProcessRegressor(kernel=kernel, random_state=0)fig, axs = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(10, 8))# plot prior
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[0])
axs[0].set_title("Samples from Gaussian process using Gaussian kernel")# plot posterior
gpr.fit(X_train, y_train)
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[1])
axs[1].scatter(X_train[:, 0], y_train, color="red", zorder=10, label="Observations")
axs[1].legend(bbox_to_anchor=(1.05, 1.5), loc="upper left")
axs[1].set_title("Samples from posterior distribution")fig.suptitle("Radial Basis Function kernel", fontsize=18)
plt.tight_layout()

In [65]:

kernel = 1.0 * ExpSineSquared(length_scale=1.0,periodicity=1.0,length_scale_bounds=(0.1, 10.0),periodicity_bounds=(1.0, 10.0),
)
gpr = GaussianProcessRegressor(kernel=kernel, random_state=0)fig, axs = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(10, 8))# plot prior
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[0])
axs[0].set_title("Samples from Gaussian process using periodic kernel")# plot posterior
gpr.fit(X_train, y_train)
plot_gpr_samples(gpr, n_samples=n_samples, ax=axs[1])
axs[1].scatter(X_train[:, 0], y_train, color="red", zorder=10, label="Observations")
axs[1].legend(bbox_to_anchor=(1.05, 1.5), loc="upper left")
axs[1].set_title("Samples from posterior distribution")fig.suptitle("Exp-Sine-Squared kernel", fontsize=18)
plt.tight_layout()
/opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/sklearn/gaussian_process/kernels.py:429: ConvergenceWarning: The optimal value found for dimension 0 of parameter k2__periodicity is close to the specified upper bound 10.0. Increasing the bound and calling fit again may find a better value.warnings.warn(

Example: Gaissian process model for one-dimensional data

The code heavily borrowed from Jupyter Notebook Viewer

In [11]:

# Generate the randomized sampleX = np.linspace(start=0, stop=10, num=100).reshape(-1, 1)
y = np.squeeze(X * np.sin(X)) + np.random.randn(X.shape[0])
y = y.reshape(-1, 1)

In [12]:

# The input data's visualizationplt.scatter(X, y)
plt.show()

In [3]:

# RBF kernel
kernel = GPy.kern.RBF(input_dim=1, variance=1., lengthscale=1.)

In [13]:

# Gaussian process regression using RBF kernel
m = GPy.models.GPRegression(X, y, kernel)

In [14]:

from IPython.display import display
display(m)

Model: GP regression
Objective: 204.66508168561933
Number of Parameters: 3
Number of Optimization Parameters: 3
Updates: True

GP_regression.valueconstraintspriors
rbf.variance1.0+ve
rbf.lengthscale1.0+ve
Gaussian_noise.variance1.0+ve

In [15]:

#np.int = np.int32fig = m.plot()
GPy.plotting.show(fig, filename='basic_gp_regression_notebook')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[15], line 41 #np.int = np.int323 fig = m.plot()
----> 4 GPy.plotting.show(fig, filename='basic_gp_regression_notebook')File /opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/GPy/plotting/__init__.py:150, in show(figure, **kwargs)142 def show(figure, **kwargs):143     """144     Show the specific plotting library figure, returned by145     add_to_canvas().(...)148     for showing/drawing a figure.149     """
--> 150     return plotting_library().show_canvas(figure, **kwargs)File /opt/homebrew/anaconda3/envs/smoothing-env/lib/python3.8/site-packages/GPy/plotting/matplot_dep/plot_definitions.py:96, in MatplotlibPlots.show_canvas(self, ax, **kwargs)95 def show_canvas(self, ax, **kwargs):
---> 96     ax.figure.canvas.draw()97     return ax.figureAttributeError: 'dict' object has no attribute 'figure'

In [ ]:

 

Example : Gaussian process model for multiple dimension data

In [21]:

# Load the diabetes dataset and create a dataframe
diabetes = datasets.load_diabetes()
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
df.head()

Out[21]:

agesexbmibps1s2s3s4s5s6
00.0380760.0506800.0616960.021872-0.044223-0.034821-0.043401-0.0025920.019907-0.017646
1-0.001882-0.044642-0.051474-0.026328-0.008449-0.0191630.074412-0.039493-0.068332-0.092204
20.0852990.0506800.044451-0.005670-0.045599-0.034194-0.032356-0.0025920.002861-0.025930
3-0.089063-0.044642-0.011595-0.0366560.0121910.024991-0.0360380.0343090.022688-0.009362
40.005383-0.044642-0.0363850.0218720.0039350.0155960.008142-0.002592-0.031988-0.046641

In [23]:

# Add the target variable to the dataframe
df['target'] = diabetes.target

In [36]:

# training dataset
X = df[['age', 'sex', 'bmi', 'bp']].values
y = df[['target']].values

In [37]:

# set kernel
kernel = GPy.kern.RBF(input_dim=4, variance=1.0, lengthscale=1.0, ARD = True)

In [38]:

# create GPR model
m = GPy.models.GPRegression(X, y, kernel = kernel, normalizer = True) 

In [39]:

display(m)

Model: GP regression
Objective: 580.753895481785
Number of Parameters: 6
Number of Optimization Parameters: 6
Updates: True

GP_regression.valueconstraintspriors
rbf.variance1.0+ve
rbf.lengthscale(4,)+ve
Gaussian_noise.variance1.0+ve

In [46]:

intervals = m.predict_quantiles(X)

In [47]:

df['quantile_2.5%'] = intervals[0]
df['quantile_97.5%'] = intervals[1]

In [48]:

compare_dataset = df[['age', 'sex', 'bmi', 'bp', 'target', 'quantile_2.5%', 'quantile_97.5%']]

In [49]:

compare_dataset.head(20)

Out[49]:

agesexbmibptargetquantile_2.5%quantile_97.5%
00.0380760.0506800.0616960.021872151.033.832315336.554738
1-0.001882-0.044642-0.051474-0.02632875.0-26.723536275.827439
20.0852990.0506800.044451-0.005670141.022.505766325.565029
3-0.089063-0.044642-0.011595-0.036656206.0-19.196863283.727581
40.005383-0.044642-0.0363850.021872135.0-7.185156295.350935
5-0.092695-0.044642-0.040696-0.01944297.0-26.981159276.039792
6-0.0454720.050680-0.047163-0.015999138.0-27.454852275.284279
70.0635040.050680-0.0018950.06662963.020.998093323.888776
80.0417080.0506800.061696-0.040099110.017.424206320.475631
9-0.070900-0.0446420.039062-0.033213310.03.966733306.879694
10-0.096328-0.044642-0.0838080.008101101.0-37.940518265.602567
110.0271780.0506800.017506-0.03321369.00.072888302.686168
120.016281-0.044642-0.028840-0.009113179.0-11.453087290.991778
130.0053830.050680-0.0018950.008101185.01.531656303.928312
140.045341-0.044642-0.025607-0.012556118.0-9.027330293.574895
15-0.0527380.050680-0.0180620.080401171.09.386471312.644291
16-0.005515-0.0446420.0422960.049415166.031.992828334.674057
170.0707690.0506800.0121170.056301144.024.619426327.470830
18-0.038207-0.044642-0.010517-0.03665697.0-15.012779287.479812
19-0.027310-0.044642-0.018062-0.040099168.0-18.277239284.195822

In [ ]:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#——Property属性详情

属性 属性(Property)是类(class)、结构体(structure)和接口(interface)的成员,类或结构体中的成员变量称为字段,属性是字段的扩展,使用访问器&am…

【漏洞复现】Atlassian Confluence RCE(CVE-2023-22527)

产品简介 Atlassian Confluence 是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 …

<电力行业> - 《第12课:配电(2)》

5 配网的指标 配电网与广大用户紧密联系,所以配电网是否合格还是十分重要的。 评判配电网的标准,主要有四个指标: 供电可靠性:供电可靠性是指针对用户连续供电的可靠程度。网损率:网损率可定义为电力网的电能损耗量与…

HarmonyOS Next开发学习手册——Native XComponent

场景介绍 Native XComponent是XComponent组件提供在Native层的实例,可作为JS层和Native层XComponent绑定的桥梁。XComponent所提供的NDK接口都依赖于该实例。接口能力包括获取Native Window实例、获取XComponent的布局/事件信息、注册XComponent的生命周期回调、注…

.net8 Syncfusion生成pdf/doc/xls/ppt最新版本

新建控制台程序 添加包Syncfusion.Pdf.Net.Core包&#xff0c;当前官方的版本号为26.1.39 直接上代码 Syncfusion.Pdf.PdfDocument pdfDocument new Syncfusion.Pdf.PdfDocument(); for (int i 1; i < 10; i) {var page pdfDocument.Pages.Add();PdfGraphics graphics…

销量位列第一!强力巨彩LED单元板成绩斐然

据全球知名科技研究机构Omdia《LED显示产品出货分析-中国-2023》报告显示&#xff0c;2023年强力巨彩LED显示屏销量与单元板产品销量均位列第一&#xff0c;其品牌和市场优势可见一斑。 厦门强力巨彩自2004年成立之初&#xff0c;便以技术创新和严格品控为核心竞争力&#xff0…

Redis慢查询

Redis慢查询 目录 Redis慢查询慢查询配置慢日志操作返回参数介绍 Redis的慢查询就是当命令执行时间超过预定的阈值后将这条命令记录下来&#xff0c;与MySQL的功能类似 慢查询配置 默认阈值是10毫秒&#xff0c;即10000微秒 临时修改阈值为20毫秒 127.0.0.1:6379> confi…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

哈希表(C++实现)

文章目录 写在前面1. 哈希概念2. 哈希冲突3. 哈希函数4.哈希冲突解决4.1 闭散列4.1.1 线性探测4.1.2 采用线性探测的方式解决哈希冲突实现哈希表4.1.3 二次探测 4.2 开散列4.2.2 采用链地址法的方式解决哈希冲突实现哈希表 写在前面 在我们之前实现的所有数据结构中(比如&…

分享一个用于深入分析【大模型LLM】工作原理的工具

背景 LLM Transparency Tool 是一个用于深入分析和理解大型语言模型&#xff08;LLM&#xff09;工作原理的工具&#xff0c;旨在增加这些复杂系统的透明度。它提供了一个交互式界面&#xff0c;用户可以通过它观察、分析模型对特定输入&#xff08;prompts&#xff09;的反应…

Java案例找素数(三种方法)

目录 一&#xff1a;问题&#xff1a; 二&#xff1a;思路分析&#xff1a; 三&#xff1a;具体代码&#xff1a; 四&#xff1a;运行结果&#xff1a; 一&#xff1a;问题&#xff1a; 二&#xff1a;思路分析&#xff1a; 三&#xff1a;具体代码&#xff1a; Ⅰ&#xf…

硬件开发笔记(二十三):贴片电阻的类别、封装介绍,AD21导入贴片电阻原理图封装库3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140110514 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【Mybatis 与 Spring】事务相关汇总

之前分享的几篇文章可以一起看&#xff0c;形成一个体系 【Mybatis】一级缓存与二级缓存源码分析与自定义二级缓存 【Spring】Spring事务相关源码分析 【Mybatis】Mybatis数据源与事务源码分析 Spring与Mybaitis融合 SpringManagedTransaction&#xff1a; org.mybatis.spri…

如何实现Action菜单

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

机器人控制系列教程之并联机器人简介

背景 根据其构件的连接是否构成闭环形式&#xff0c;机器人可分为串联机器人和并联机器人两种。对于串联机器人&#xff0c;其所有的构件以串联的结构形式连接起来&#xff0c;在空间组成一种开环结构&#xff0c;因而具有工作空间大&#xff0c;灵活性好等优点&#xff0c;但…

【避雷实测】宠物空气净化器怎么选?希喂、小米、安德迈谁更值得入手!

不知道家里养猫的朋友们有没有注意到&#xff0c;每逢春夏季节&#xff0c;无论是户外还是室内&#xff0c;我们的鼻子常常感到痒痒的。户外的痒感往往是因为那些飘散的杨柳絮&#xff0c;而在室内&#xff0c;这种痒感很可能是由于猫主子的毛发飘浮在空气中所引起的。 为了能…

Qt:8.QWidget属性介绍(focuspolicy属性-控件焦点、stylesheet属性-为控件设置样式)

目录 一、focuspolicy属性-控件焦点&#xff1a; 1.1focuspolicy属性介绍&#xff1a; 1.2设置焦点策略——setFocusPolicy()&#xff1a; 1.3获取控件的焦点策略——focusPolicy()&#xff1a; 二、stylesheet属性——为控件设置样式&#xff1a; 2.1 stylesheet属性介绍…

Golang-map理解

golang-map语雀笔记整理 map的底层实现hmapbmap map是如何做到O(1)的复杂度的&#xff1f;map扩容策略 师兄问题回答 map的底层实现 hmap hmap的结构体核心字段有&#xff1a;buckets 桶数组地址&#xff0c; B 定位值&#xff0c;桶的数目是2^B个&#xff0c; count 当前map的…

黑马点评下订单-小程序下单没问题但是Postman发送请求失败了,返回401

经过多方探索&#xff0c;这个✓8错误就是由于黑马点评使用了拦截器&#xff0c;我们直接发送请求是会被拦截器拦截下来的&#xff0c;我给出的解决方案是通过配置Postman解决&#xff0c;方法很简单&#xff01; 解决方案 右边的value写上Redis里面登录所用token值就可以了…

使用zdppy_api+onlyoffice word文档在线共同编辑,附完整的vue3前端代码和python后端代码

参考文档&#xff1a; https://api.onlyoffice.com/zh/editors/basic https://api.onlyoffice.com/zh/editors/coedit 基本的架构思考&#xff1a; 文档表&#xff1a;记录的是文档信息 key&#xff1a;这个key可以标识唯一的一个文档&#xff0c;可以是文档的hash值fileType…