高斯过程的数学理解

目录

一、说明

二、初步:多元高斯分布

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

四、高斯过程的数学背景

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

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.rhkb.cn/news/365865.html

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

相关文章

Kubernetes的发展历程:从Google内部项目到云原生计算的基石

目录 一、起源与背景 1.1 Google的内部项目 1.2 Omega的出现 二、Kubernetes的诞生 2.1 开源的决策 2.2 初期发布 三、Kubernetes的发展历程 3.1 社区的成长 3.2 生态系统的壮大 3.3 重大版本和功能 3.4 多云和混合云的支持 四、Kubernetes的核心概念 4.1 Pod 4.…

Mustango——音乐领域知识生成模型探索

Mustango:利用领域知识的音乐生成模型 论文地址:https://arxiv.org/pdf/2311.08355.pdf 源码地址:https://github.com/amaai-lab/mustango 论文题为**“**利用音乐领域知识开发文本到音乐模型’Mustango’”。它利用音乐领域的知识从文本指…

明日周刊-第14期

不好意思又拖更了哈哈哈。不过赶在7月的第一天,打算更新一下。建党节,值得纪念的一天。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 国内科技新闻 深中通道建成通车 时间:2024年6月30日 内容:深圳至中山跨江通道正式建成开…

【Spring Boot】spring boot环境搭建

1、环境准备 JDK安装:确保安装了Java Development Kit (JDK) 1.8或更高版本。JDK是Java编程的基础,Spring Boot项目需要它来编译和运行。Maven或Gradle安装:选择并安装Maven或Gradle作为项目构建工具。Maven通过pom.xml文件来管理项目的依赖…

PCL 基于点云RGB颜色的区域生长算法

RGB颜色的区域生长算法 一、概述1.1 算法定义1.2 算法特点1.3 算法实现二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 算法定义 点云RGB区域生长算法: 是一个基于RGB颜色信息的区域生长算法,用于点云分割。该算法利用了点云中相邻点之间的颜色相似性来将点云分割成…

nodejs--【Express基本使用】

10 【Express基本使用】 https://www.expressjs.com.cn/ 基于 Node.js 平台,快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目,在安装npm之前可先安装淘宝镜像: npm install -g cnpm -…

【从零开始学架构 架构基础】五 架构设计的复杂度来源:低成本、安全、规模

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

vue中路由来回切换页面直接卡死

今天发现一个很严重的问题,项目好不容易做好了,结果页面多了,切换之后卡死。页面所有的交互效果都失效了。 排查了许久的错误原因最后发现原来是路由名称重复了。 如上图当页面跳转到riskdetails详细页面之后,框架则被这个详情页…

rga_mm: RGA_MMU unsupported Memory larger than 4G!解决

目录 报错完整log如下:解决方案:报错完整log如下: [ 3668.824164] rga_mm: RGA_MMU unsupported Memory larger than 4G! [ 3668.824305] rga_mm: scheduler core[4] unsupported mm_flag[0x0]! [ 3668.824320] rga_mm: rga_mm_map_buffer map dma_buf err

(七)glDrawArry绘制

几何数据&#xff1a;vao和vbo 材质程序&#xff1a;vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU&#xff0c;使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

六西格玛绿带培训的证书有什么用处?

近年来&#xff0c;六西格玛作为一套严谨而系统的质量管理方法&#xff0c;被广泛运用于各行各业。而六西格玛绿带培训证书&#xff0c;作为这一方法论中基础且重要的认证&#xff0c;对于个人和企业而言&#xff0c;都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息&#xff0c;更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

汽车内饰塑料件光照老化实验箱

塑料件光照老化实验箱概述 塑料件光照老化实验箱&#xff0c;又称为氙灯老化试验箱&#xff0c;是一种模拟自然光照条件下塑料材料老化情况的实验设备。它通过内置的氙灯或其他光源&#xff0c;产生接近自然光的紫外线辐射&#xff0c;以此来加速塑料及其他材料的光老化过程。…

《重构》读书笔记【第1章 重构,第一个示例,第2章 重构原则】

文章目录 第1章 重构&#xff0c;第一个示例1.1 重构前1.2 重构后 第2章 重构原则2.1 何谓重构2.2 两顶帽子2.3 为何重构2.4 何时重构2.5 重构和开发过程 第1章 重构&#xff0c;第一个示例 我这里使用的IDE是IntelliJ IDEA 1.1 重构前 plays.js export const plays {&quo…

MySQL的简介和安装目录

今日总结到此结束&#xff0c;拜拜&#xff01;

Lua: 轻量级多用途脚本语言

Lua 是一种高效而轻量级的脚本语言&#xff0c;具备强大的扩展性和灵活性&#xff0c;广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初&#xff0c;…

0-30 VDC 稳压电源,电流控制 0.002-3 A

怎么运行的 首先&#xff0c;有一个次级绕组额定值为 24 V/3 A 的降压电源变压器&#xff0c;连接在电路输入点的引脚 1 和 2 上。&#xff08;电源输出的质量将直接影响与变压器的质量成正比&#xff09;。变压器次级绕组的交流电压经四个二极管D1-D4组成的电桥整流。桥输出端…

Python 中别再用 ‘+‘ 拼接字符串了!

目录 引言 为什么不推荐使用 "" 示例代码 更高效的替代方法 使用 join 方法 示例代码 使用格式化字符串&#xff08;f-strings&#xff09; 示例代码 引言 大家好&#xff0c;在 Python 编程中&#xff0c;我们常常需要对字符串进行拼接。你可能会自然地想到…

【Python函数编程实战】:从基础到进阶,打造代码复用利器

文章目录 &#x1f68b;前言&#x1f680;一、认识函数&#x1f308;二、函数定义❤️三、函数调用⭐四、实参与形参&#x1f4a5;1. 形式参数&#x1f6b2;2. 实际参数&#x1f525;1. 位置参数☔2. 关键字参数&#x1f3ac;3. 默认参数&#x1f525;4. 可变数量参数(不定长参…

VUE2及其生态查漏补缺

1、数据代理概括 数据代理过程相当于是进行了 vm 代理 vm_data中的属性&#xff0c;vm._data 是与 我们vue文件中写的 data是全等的 //创建Vue实例let data { //data中用于存储数据&#xff0c;数据供el所指定的容器去使用&#xff0c;值我们暂时先写成一个对象。name:atguig…