num_points = 20
target_mean = np.zeros(num_points)
target_mean[8] = 4.
target_mean[9] = 4.
target_mean[10] = 4.
target_cov = np.eye(num_points)
for i in range(num_points-1):
target_cov[i+1,i] = target_cov[i,i+1] = 0.1
data_sample_y = 2.*np.random.multivariate_normal(target_mean,target_cov,size=60).T
noise = np.random.normal(0.,1.,num_points)
data_sample_x = np.linspace(0,100,num_points)
data_to_model = data_sample_y[:,30] + noise
它来自一个20维的多元高斯函数,除中间3个位置的均值为4外,其他位置的均值都为0,第一个非对角元素的协方差矩阵都为0.1。再把整个数据乘以2(没有其他的特殊原因只是为了好玩)。这里生成了60个样本。随机挑出一个,然后加上方差为1的随机正态噪声。如下图所示,蓝色的线是挑选的样本,蓝色的点是添加了噪声的样本,灰色的虚线是来自相同分布的剩余样本,黑线是它们的平均值。
本文中用于概念验证的模拟数据中的所有样本。蓝点是用于拟合的数据,灰色虚线是相同分布的相似样本,黑线是代表这些样本的平均值信号。
灰色线条是为了给我们一个来自这个分布的数据的不确定性的视觉感官。它还可以作为我们方法的一个额外功能,将试图根据给定的一个样本来估计其不确定性。当然主要的目标是估计黑线——信号。
我们为一个带有噪声的样本(上图中的蓝点)添加了HMC的两层GP实现,并得出了以下结果。这里有24个参数(τ²,g,θy,θy,和20 Ws),所以不可能显示整个空间。下图只显示了其中两个参数。左边的两个θs是故意从远离正确值的地方开始的,轨迹向一个静止点移动的速度很快,当到达了可能的概率最大值,就开始围绕它盘旋。右边的图显示了总能量vs迭代次数。
使用参数的抽样后验值推断了200个样本,结果如下图所示,其中蓝线和黑线分别代表原始样本和真实数据的平均值。红线是推断样本的均值。灰色虚线是所有要与上图模拟数据进行比较的单个推断样本。
最后,这就是我们的最终结果。黑色——我们试图恢复的信号,红色——我们对它的最佳猜测,灰色虚线——我们猜测的 95% 置信区间。
这些置信区间可能比真实的要宽一点,是因为明确检测到了中间信号的变化,我们不会被两边的摆动所迷惑。考虑到我们的样本很少(一个样本有多种变异来源,没有重复),这是一个非常强大的结果,对吧?
[1] C. E. Rasmussen and C. K. I. Williams, Gaussian Processes for Machine Learning, (2006), The MIT Press ISBN 0–262–18253-X.
[2] A. Sauer, R. B. Gramacy, and D. Higdon, (2021) Active Learning for Deep Gaussian Process Surrogates, arXiv:2012.08015v2
[3] M. Betancourt, A Conceptual Introduction to Hamiltonian Monte Carlo, (2018), arXiv:1701.02434