一般的,我们在机器学习里学到的回归方法都是先定义一个函数,然后利用最小二乘法去拟合曲线。此外,也有一些回归任务使用了支持向量回归的方法。但这些方法只能给出具体的预测值,并不能给出该预测值的置信区间。下面我们介绍一种既能够给出预测值,又能给出该预测值置信区间的回归方法——高斯过程回归。
一个简单的线性回归例子
我们先来看一个利用高斯过程回归的简单的例子。假设我们有一个数据集,要对这个数据集进行回归拟合,数据集中只包含三个点:。那么,高斯过程回归如下:
在高斯过程回归中,我们会假设数据集中的所有的目标 服从多维正态分布**,该分布均值为
, 协方差矩阵为
。
这里协方差矩阵就是关于输入 的核矩阵,用来表示不同
之间的相关程度。这里,我们用高斯核函数来得到核矩阵。高斯核函数为:
根据 得到的核矩阵为:
那么我们有:
至此,我们就可以开始做回归分析了。假设现在我们有一个新的 ,那么对应的
怎么求呢?我们假设数据集中的所有回归目标
都服从联合正态分布,显然有:
其中,我们定义
我们可以根据这个联合正态分布可以得到 的分布。这里,我们暂时不给出证明过程,直接给出分布的结果。
其中
这个方法本质是一个贝叶斯方法:根据先验的联合分布得到一个随机变量的分布,这里的推导过程后续会讲到。
下图是我们用数据集 ,并利用高斯过程回归的结果,采用的高斯核为:

代码如下:
import numpy as npimport matplotlib.pyplot as pltdef mu_sigma(x, y):length = len(x)K = np.zeros([length,length])for i in range(length):for j in range(length):a = x[i]b = x[j]K[i][j] = np.exp(-2*(a - b)**2)K_a = K[0:-1, 0:-1]k_star = K[0:-1, -1]k_dstar = K[-1, -1]mu = np.dot(np.dot(k_star, np.linalg.inv(K_a)), y)sigma = -np.dot(np.dot(k_star, np.linalg.inv(K_a)), k_star) + 1return (mu,sigma)x = np.array([1,2,3])y = np.array([2,4,6])X = []Sig = []xx = np.arange(0.5,3.5,0.1)for c in xx:mu,sigma = mu_sigma(np.hstack([x, c]),y)X.append(mu)Sig.append(sigma)X = np.array(X)Sig = np.array(Sig)# 绘制图像plt.figure()plt.plot(xx, X)plt.plot(xx, X-Sig, '-', c='limegreen', linewidth=0.25)plt.plot(xx, X+Sig, '-', c='limegreen', linewidth=0.25)plt.scatter(x,y)plt.fill_between(xx, X-Sig, X+Sig, color='limegreen', alpha=.25)plt.show()
推导过程
下面我们给出从先验的高斯分布的联合分布推导到单变量高斯分布的过程。
三个需要用到的定理
证明
直觉
下面我们讲一下为什么高斯过程回归能够拟合曲线,它背后的意义是什么。以下是个人拙见:
- 使用核函数将输入的特征映射到另一个空间,得到不同样本间的关系。这么做的目的是:在原始空间中,样本的特征可能不明显,但是将其映射到其他空间中特征就更明显了,这有助于表示不同样本之间的关系。
- 利用一个接近无穷维的高斯分布,对回归目标
进行建模。
常见的核函数
下面给出在高斯过程回归中几种常见的核函数。
参考文献
