添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
近视的鸭蛋  ·  mysql ...·  4 月前    · 
聪明的椅子  ·  JQuery 选择器 - 知乎·  1 年前    · 

1.高斯过程是定义在 连续域上的无限多个服从高斯分布的随机变量 所组成的随机过程

2.高斯过程回归有两个视角: 权重空间视角和函数空间视角 ,这两者是等价的

3.权重空间视角是 贝叶斯线性回归与核函数的结合形式

4.函数空间视角是 函数服从高斯过程的随机变量 ,能 优化“黑盒子”函数 的效果

5.高斯过程回归也 应用在机器学习模型超参数调节 中,效率比网格搜索、随机搜索都要高

高斯过程回归有两个视角,一个是 权重空间视角(weight-space view) ,另一个是 函数空间视角(function-space view), 它们达到的效果一样的。我们先从高斯过程开始介绍,理解这两个视角下的高斯过程回归,你会发现它其实是贝叶斯线性回归的非线性形式,且为后面深入理解贝叶斯调参打下基础。

高斯过程(Gaussian Process,GP) 是定义在连续域上的无限多个服从高斯分布的随机变量所组成的随机过程。

一个高斯过程由mean function和kernel function唯一确定(高斯过程存在性定理) .

下面通过一个例子来理解高斯过程。

假设人的心率在一天中是服从正态分布的,那么心率就是一个随机变量,在每天的任意一个时刻测量都会得到一个值。如果星期一到星期四都进行测量,那么就会得到下面的一幅图:

从函数视角去看,每天有无数个时刻,这些时刻的测量值就构成了一个无限维的高斯分布,我们就把这个过程称为高斯过程。

注:关于例子更多的解释见参考资料第一个链接

高斯回归:权重空间角度

贝叶斯线性回归 一文中,我们求解了 以参数为随机变量视角下线性回归 的问题,这里回顾一下问题与结论:

本文,我们思考一个更普遍的情况。如果特征与参数之间不再是线性的关系,而是其他非线性关系的时候,如何求解参数的概率分布呢?

我们在 核函数 一文中提到了一种解决思路,对特征做高维映射,使得其在高维空间上与参数是线性关系的。而高斯过程回归的第一个视角,正是研究这个问题的。

跟核函数一样,对特征向量X做高维映射后贝叶斯线性回归求解参数如下:

下面我们求解其均值与方差

高维空间上均值计算:

为了计算方差,我们需要用到woodbury formula公式:

根据该公式可以计算高维空间上方差:

于是我们得到高维空间上贝叶斯线性回归参数概率分布:

我们观察其均值与方差的表达式,可以发现

因此,分布函数可以改写成下面的形式:

我们也 把这个过程称为 高斯过程回归 ,它实质上是 贝叶斯线性回归与核方法的结合形式.

这里需要澄清的是,该过程与高斯过程没有关系,它仅仅是一个名字,我们也把这个从参数角度的推导称为 高斯过程回归的权重空间视角(weight-space view)

高斯回归:函数空间角度

函数空间关注的是f(x),把它当作一个随机变量,根据贝叶斯线性回归映射到高维空间有:

于是f(x)均值为

这里可以得到两点:

首先 随机变量f(x)之间的协方差可以通过样本点的核函数计算得到 ;其次它们的 一系列组合{f(x)}就是服从一个高斯过程GP

把上面的结果应用到回归里面,就是高斯过程回归,问题变成下面这样:

注:这里的均值,协方差是关于f(x)的均值和协方差,这一点需要清晰

注:求解高斯条件概率分布见文章 高斯分布

我们把上面以函数视角的推导过程称为 函数空间视角(function space view)的高斯过程回归.

仔细观察上面的推导过程,我们始终不知道特征X与参数w之间的关系,这给我们一个很有用的启发,就是我们不需要知道函数的表达式,也可以对它进行建模。就是把函数表达式当作黑盒子,利用高斯过程回归,依然能拟合其分布。这个思想也应用到了机器学习的调参中,我们后面提到贝叶斯优化再具体讲解。

高斯过程回归应用

下面通过一个例子,来直观感受高斯过程回归的原理。小编通过python实现这个过程,分为手动实现和sklearn包内置模块实现。

我们假设要优化的黑盒子函数为f(x)=xsinx,为了演示方便,设x只有一维特征。利用python生成只有6个样本点的训练集。

def y(x, noise_sigma=0.0):
    x = np.asarray(x)
    y = x*np.sin(x) + np.random.normal(0, noise_sigma, size=x.shape)
    return y.tolist()
train_X = np.array([1, 3, 5, 6, 7, 8]).reshape(-1, 1)
train_y = y(train_X, noise_sigma=1e-4)
test_X = np.arange(0, 10, 0.1).reshape(-1, 1)

我们指定核函数为RBF函数,为其设置RBF函数的超参数

sca_l = 1  #sklearn内置以标准差为参数
ga = 1/(2*sca_l*sca_l) #python内置的rbf核函数为gamma参数

在文章 核函数 中,我们知道sklearn.metrics.pairwise提供的RBF是以gamma参数传入,而高斯回归模块提供的是标准差,所以用两个参数统一,为了比较手动和自动的区别是否一致

根据函数空间的高斯回归的均值与方差表达式,编写下面程序

K = rbf_kernel(train_X,gamma=ga)
u = np.array([0 for i in train_y]).reshape(-1,1) #均值假设为0
a = rbf_kernel(test_X,train_X,gamma=ga) #k(x*,x)
k = linalg.inv(K+np.diag(np.random.normal(0, scale=1e-4, size=K.shape))) #(K+o^2I)^-1
c = rbf_kernel(train_X,test_X,gamma=ga) #k(x,x*)
mu = np.array([u[0] for i in test_X]).reshape(-1,1)+np.dot(np.dot(a,k),train_y-u) #均值后验
cov = rbf_kernel(test_X,gamma=ga)-np.dot(np.dot(a,k),c) #更新协方差矩阵
test_y = mu.ravel()
uncertainty = 1.96 * np.sqrt(np.diag(cov)) #95%置信区间

作图看看结果

sklearn提供了高斯回归的模块包,我们利用内置包看看结果是否与手动结果一致

from sklearn.gaussian_process.kernels import  RBF
from sklearn.gaussian_process import GaussianProcessRegressor
 
ker = RBF(length_scale=sca_l, length_scale_bounds='fixed')
gpr = GaussianProcessRegressor(kernel=ker, n_restarts_optimizer=2,normalize_y=False)
gpr.fit(train_X, train_y)
mu, cov = gpr.predict(test_X, return_cov=True)
test_y = mu.ravel()
uncertainty = 1.96 * np.sqrt(np.diag(cov))
plt.figure()
plt.title("GPR自动实现")
plt.fill_between(test_X.ravel(), test_y + uncertainty, test_y - uncertainty, alpha=0.1)
plt.plot(test_X, test_y, label="predict")
plt.scatter(train_X, train_y, label="train", c="red", marker="x")
plt.legend()
plt.show()

可见,两者一致,也证明了小编推导的过程是没有问题的

最后,高斯回归也应用在超参数较多的调参中,叫贝叶斯优化调参,它比网格搜索,随机搜索都高效,我们不久将会推出文章详细介绍

参考资料:

http://www.columbia.edu/~jwp2128/Teaching/E6892/papers/mlss2012_cunningham_gaussian_processes.pdf

https://scikit-learn.org/stable/user_guide.html

1.高斯过程是定义在连续域上的无限多个服从高斯分布的随机变量所组成的随机过程2.高斯过程回归有两个视角:权重空间视角和函数空间视角,这两者是等价的3.权重空间视角是贝叶斯线性回归与核函数... 高斯过程回归的和其他回归算法的区别是:一般回归算法给定输入X,希望得到的是对应的Y值,拟合函数可以有多种多样,线性拟合、多项式拟合等等,而高斯回归是要得到函数f(x)的分布,那么是如何实现的呢? 对于数据集,令,从而得到向量, 将所需要预测的的集合定义为,对应的预测值为, 根据贝叶斯公式有:
Matlab实现基于高斯过程回归(GPR)的数据多变量输入回归预测(完整源码和数据) Matlab实现基于高斯过程回归(GPR)的数据多变量输入回归预测(完整源码和数据) 1.输入多个变量,输出单个变量; 2.多指标评价,评价指标包括:R2、MAE、MSE、RMSE等,代码质量极高; 3.excel数据,方便替换。 4.运行环境2018及以上。
1 基本概念 在高斯过程,连续的输入空间的任何点与正态分布的随机变量相关,而且任何随机变量的有限集合满足多重正态分布,例如变量间的任意线性组合是正态分布,高斯过程分布是所有随机变量在连续域中的联合分布 在机器学习理论中,针对于推广训练数据(generalize train data)的算法,如果学习方法在对系统发出请求之前进行,称为急切学习(eager learning),如果学习方法滞后于对系统的请求,称. 考虑一条满足如下方程的曲线: y = exp(ax2x^2x2+ bx + c) + w,其中a,b,c为曲线的参数,w是高斯噪声,满足w~(0,σ2\sigma^2σ2)。 这是个非线性模型。假设我们有N个关于x,y的观测点,想根据这些数据点来求出曲线的参数。那么可以通过求解下面的最小二乘问题来估计曲线参数: min⁡a,b,c\min\limits_{a,b,c}a,b,cmin.
高斯过程(Gaussian Processes, GP)是概率论和数理统计中随机过程的一种,是多元高斯分布的扩展,被应用于机器学习、信号处理等领域。博主在阅读了数篇文章和博客后才算是基本搞懂了GP的原理,特此记录。本文目前暂对高斯过程的公式推导和高斯过程回归原理及其优缺点进行讲解和阐述,后续根据个人学习进度再更新源码等内容。 一、一维高斯分布 我们从最简单最常见的一维高斯分布开始。 众所周知,一维高斯分布,又叫一维正态分布的概率密度函数为: 式中,表示均值,表示方差,均值和方差唯一的决定了曲线的
高斯过程回归(Gaussian process regression,GPR)是一个随机过程(按时间或空间索引的随机变量集合),这些随机变量的每个有限集合都服从多元正态分布,即它们的每个有限线性组合都是正态分布。高斯过程的分布是所有这些(无限多)随机变量的联合概率分布。定义:一个高斯过程是一组随机变量的集合,这组随机变量的每个有限子集构成的联合概率分布都服从多元高斯分布,即: f∼GP(μ,k)(1−1)f \sim GP(\mu,k) \qquad(1-1) f∼GP(μ,k)(1−1) 其中μ(x)\m
一、什么是高斯过程   高斯过程是一种随机过程,即按时间或者空间索引的随机变量的集合。这个集合中的有限个随机变量构成多维高斯分布。高斯过程就是这个集合中所有随机变量(无限多个)的联合分布。 二、高斯分布 2.1 一元高斯分布   一元高斯分布的概率密度函数为: f(x)=1σ2πe−12(x−μσ)2(1) f(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}(\frac{x-\mu}{\sigma})^2}\tag{1} f(x)=σ2π​1​e−21​(σx
高斯过程回归GPR)是一种基于贝叶斯统计的非参数回归方法,可以用于处理连续型的数据。在Sklearn中,可以使用GaussianProcessRegressor类来实现GPR。下面,我将提供一个简单的案例来演示如何使用Sklearn实现GPR回归。 假设我们有一个数据集,数据集中包含了一些关于房屋的信息,如房屋的面积、房间数量、卫生间数量、车库数量等等,以及房屋的售价。我们希望使用这些信息来预测房屋的售价。 首先,我们需要导入必要的库和数据集: ```python import numpy as np from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C from sklearn.datasets import load_boston boston = load_boston() X, y = boston.data, boston.target 然后,我们需要定义一个内核函数。在Sklearn中,可以使用RBF类来创建一个径向基函数内核。我们还可以使用C类来设置内核的常量。在这个例子中,我们将使用默认值。 ```python kernel = C(1.0, (1e-3, 1e3)) * RBF(10, (1e-2, 1e2)) 接下来,我们可以创建一个GPR模型,并使用fit方法来训练模型。 ```python model = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=9) model.fit(X, y) 最后,我们可以使用predict方法来预测新的房屋售价。下面是一个简单的示例: ```python X_new = np.array([[6.5, 4, 2.5, 2, 500, 80, 5, 5, 7, 300, 20, 300, 20]]) # 创建一个新的房屋数据 y_pred = model.predict(X_new) # 预测新的房屋售价 print(y_pred) 输出结果: ```python [25.10548503] 这意味着,根据我们提供的房屋数据,预测的售价大约为25.1万美元。