为什么要了解高斯过程呢?因为不了解高斯过程就不能聊贝叶斯优化。

假设有这么一个函数:

。现在有训练的数据y和一堆X。然后来了一个新的X让你用既有的数据去预测者个新的X所对应的y。

高斯过程(回归)的思路是:因为y之间的关系是由X之间的关系决定的。所以可以利用新来的X和既有的X之间的关系来对新来的X的y进行推测。在这里有用到联合概率分布,也就是给定一对X和y同时出现时的概率分布,比如说丢骰子,掷出六的同时是我丢骰子的概率。之后还有b。b从概率分布里取一个值的时候,我们就可以得到一个确定的y。

所以我们可以对原本的b进行假设。假设它是服从一个平均值为0,方差是

的高斯分布。这里涉及一个很抽象的词叫“抽样”。

首先,因为b的取值是服从一个平均值为0,方差是

的高斯分布,所以它的概率分布图长成这样的,这里我让它的方差是1:
import numpy as np
import matplotlib.pyplot as pltfrom scipy.stats import norm
import matplotlib.pyplot as pltx = np.arange(-8,8,0.01)
y = norm.pdf(x,0,1)plt.plot(x,y,color='m')
plt.xlim(-8,8)

纵轴是概率,横轴是取值。因为平均值是0所以峰值在0

但是b其实不是一个值而是一堆服从高斯分布的值。所以比如x的取值是-1,-0.9...0, 0.1...0.9, 1的话,对于高斯分布里的每一个b都会有一个y。比如说从高斯分布里面取两个b1=0.1,b2=-0.38,然后作图之后就得到了两个抽样出来的样本:

b1 = 0.1*x
plt.plot(x,b1,color='m',linestyle = "dotted")
plt.xlim(-8,8)

另一个:

b2 = -0.38*x
plt.plot(x,b2,color='m',linestyle = "dotted")
plt.xlim(-8,8)

这是两个抽样。那如果把高斯分布里面所有值全部抽样之后会是什么样子呢?

首先,这里点跟点之间的关系是线性关系,所以给它取个名字叫'linear'。这里我们使用一个包叫GPy,安装方法就是pip install GPy。由于我们将点和点之间的关系假设为线性关系,这里我们把kernel设定为linear。我理解的kernel就是种针对训练数据集x里面点和点之间关系所进行的特殊计算。

比如说抽样10次,大概就是这样:

import GPynp.random.seed(seed=9527)
N = 100
x = np.linspace(-1, 1, N)
x = x[:, None]kernel = GPy.kern.Linear(input_dim=1)
cov = kernel.K(x, x)
mu = np.zeros(N)
y = np.random.multivariate_normal(mu, cov, size=20)fig = plt.figure()
ax = fig.add_subplot(1,1,1)
for i in range(10):ax.plot(x[:], y[i,:])
plt.xlim(-1,1)

然后你可以从里面找一个最接近真正数据的线。这样做的好处是我们可以直观的看到y的不确定性,也就是y的变动是在一个范围里面的。

如果训练集的各个样本之间的关系仅仅是线性的话那也未必太僵化了。于是为了能使的模型能考虑更复杂的高维非线性的关系,一般用的比较多的是高斯核函数,也就是假设训练集里面每一个数据都服从高斯分布。数据之间的关系可以用以下表示:

当这里的高斯分布的γ等于1的时候,利用这个kernerl同样的可以对数据进行抽样。输入的是某一个X,然后计算完它和所有的数据之间的关系或者说距离之后求和作为新输出的y的方差。然后利用平均值为0这个性质就可以对y进行抽样了。这里和线性kernel是一样的也可以通过抽样得到y的不确定性。

import GPy
import numpy as np
import matplotlib.pyplot as pltkernel1 = GPy.kern.RBF(input_dim=1, variance=1)
#调出RBF也就是高斯kernel, 设定输入次元1,方差1
np.random.seed(seed=123)
#同样准备100个点
N = 100
x = np.linspace(-1, 1, N)
x = x[:, None]
mu = np.zeros(N)
cov = kernel.K(x, x)
#20次抽样
y_sim = np.random.multivariate_normal(mu, cov, size=20)

抽样了20次。下面是抽样3次的结果:

通过这样的方式,高斯过程不仅可以输出一个预测值,还可以对目标值的不确定性进行把握。接下来就试一试高斯过程回归。

为了更好的看效果,这里就用一个比较简单的非线性函数做一个数据集。然后从里面抽一部分数据出来作为训练集。

n=50
x= np.linspace(1, 23*np.pi, n)
y= 3.22*np.sin(0.2*x)+2.33*np.cos(0.03*x)
missing_rate = 0.15
index = np.sort(np.random.choice(np.arange(n), int(n*missing_rate), replace=False))

画图出来长成这样:

from matplotlib import pyplot as plt
%matplotlib inlineplt.figure(figsize=(12, 5))plt.plot(x, y, color='m', label='correct')plt.plot(x[index], y[index], 'o', color='black', label='sample')plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12)
plt.show()

这里的黑点就是抽出来的作为训练集的样本。然后训练这些黑点来预测整个函数。

x_train = np.copy(x[index])
y_train = np.copy(y[index])
x_test = np.copy(x)

设定kernel

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

输入次元为1,方差随便选了1。这里有点类似sklearn。

model = GPy.models.GPRegression(x_train[:, None], y_train[:, None], kernel=kernel)
model.optimize()
model.plot()

它自带了一个作图功能,这里可以看到图像里面的蓝色的面积就代表模型的不确定性,显然数据密度高的地方不确定性就越低。这里的预测结果是这样的:

y_qua_pred = model.predict_quantiles(x_test[:, None], quantiles=(2.5, 50, 97.5))[0]
y_qua_cov= model.predict_quantiles(x_test[:, None], quantiles=(2.5, 50, 97.5))[1]

一个是预测值一个是方差。

反正跟sklearn的一般模型一样可以输出的不仅是模型的预测值还可以输出模型的不确定性,利用这两个东西可以去算哪些实验参数的候补是更需要做的。

rbf核函数_高斯过程回归础(使用GPy和模拟函数数据集)相关推荐

  1. 趋势预测方法(四)高斯过程回归_时序概率性预测

    高斯过程回归(GPR) a基本原理: 利用高斯过程回归将可能的数据趋势曲线都保存下来(每条趋势曲线都有自己的置信度,在区间内呈高斯分布),最后在一张图中显示出来,再判断总体的趋势情况. b算法原理: ...

  2. python高斯噪声怎么去除_高斯过程和高斯过程回归

    本文未经允许禁止转载,谢谢合作. 本文我们介绍高斯过程及其在机器学习中应用的一个例子--高斯过程回归. 高斯过程在语音合成中有广泛的应用,我计划在之后的文章中介绍一些应用,但本节我们重点讨论相关的基础 ...

  3. python 高斯烟羽模型_GPR(高斯过程回归)详细推导

    GPR(高斯过程回归)详细推导 一.综述 GPR来源于线性模型,有两种方式可以推导出GPR,一种是weight space view,另外一种是function space view.两者考察方式假设 ...

  4. GPR(高斯过程回归)

    写在前面:   本文为科研理论笔记的第三篇,其余笔记目录传送门: 理论笔记专栏目录   介绍结束下面开始进入正题: 1 高斯分布 ​   一元高斯分布的概率密度函数为: p(x)=1σ2πexp⁡(− ...

  5. 高斯过程回归的权空间观点推导及代码实现

    文章目录 1.高斯过程简介 1.1定义 2.部分基础知识(已具备的直接跳至第3节) 2.1 部分矩阵计算基础 2.1.1 分块矩阵求逆 2.1.2 矩阵求逆引理 2.2 多元高斯分布 2.2.1 联合 ...

  6. python 高斯过程_高斯过程 Gaussian Processes 原理、可视化及代码实现

    本文搬运于个人博客,欢迎点击这里查看原博文. 高斯过程 Gaussian Processes 是概率论和数理统计中随机过程的一种,是多元高斯分布的扩展,被应用于机器学习.信号处理等领域.本文对高斯过程 ...

  7. 高斯过程回归python_sklearn文档 — 1.7. 高斯过程

    原文章为scikit-learn中"用户指南"-->"监督学习的第七节:Gaussian Processes"###### 高斯过程(GP)是一种被设计来 ...

  8. 转载:说说高斯过程回归

    原文链接: 说说高斯过程回归 – 我爱计算机 http://www.52cs.org/?p=509&_360safeparam=1929050203 高斯过程回归 来自于 我爱计算机 WWW. ...

  9. ​使用高斯过程回归指导网络轻量化

    论文标题:Model Rubik's Cube:Twisting Resolution, Depth and Width for TinyNets(NeurIPS 2020) 论文地址:https:/ ...

最新文章

  1. vue 动态生成路由菜单(从后端请求到菜单数据,生成左侧菜单栏)
  2. python装饰器函数-python3 函数:函数装饰器
  3. 好书推荐 Beginning C# Objects
  4. yml和properties的加载顺序
  5. ei会议和ei源刊的区别_核心期刊SCI论文发表 | SCI和EI和核心有什么区别
  6. Android(java)学习笔记133:Eclipse中的控制台不停报错Can't bind to local 8700 for debugger...
  7. initializer element is not a compile-time constant
  8. oracle数据库数据表误删后,恢复数据处理方式
  9. Linux pip 安装模块时,一直黄字错误:Could not find a version that satisfies the requirement...
  10. Hosts Setup Utility – 在线更新 hosts
  11. c语言程序设计贪吃蛇报告,C语言“贪吃蛇”程序设计报告.doc
  12. Linux 下安装与设置Vim编辑器
  13. uiniapp实现微信授权登录
  14. 程序设计基础大作业:学生信息管理系统plus(彩色界面,登录功能,文件操作,多文件)
  15. 你很牛,且是刚毕业的,那就到华为上班吧!--绝对隐私:华为员工待遇全面揭秘
  16. android学习笔记之GoogleMap
  17. 开源Linux面板-1Panel
  18. 清晨为何不能空腹喝蜂蜜水
  19. C语言程序设计学习001——初步认识
  20. hiho第三周 KMP

热门文章

  1. java调用python,传参json字符串,含中文传参
  2. Java程序中fix time_Java Position.setFixTime方法代码示例
  3. 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?
  4. Java自动生成增量补丁自动部署_java-Hibernate正在为表生成自动增量交替ID
  5. 博图如何上载wincc程序_WINCC 博途 以太网下载方式
  6. Java常用类StringBuffer详解
  7. 114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】...
  8. 第一小节 初识面向对象
  9. 最近用的几个sql语句
  10. Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]