高斯过程是什么?

本文译自: Duane Rich 的文章Which is your favorite Machine Learning algorithm?

几乎所有的有监督机器学习算法都专注于找到一个函数f()f(),这个函数是从特征xix_i到标签yiy_i的映射的一个近似。通常情况下一个函数的参数决定了一个函数。根据数据,我们通过确定这些参数的(后验)分布来确定可能的函数。

高斯过程允许我们根据一组任意有限的输入和输出来引用函数。我们通过一个分布来指定函数:
f(x)=GP(m(x),k(x,x)) f(x)=GP(m(x),k(x,x'))
其中m(x)m(x)k(x,x)k(x,x')是给定的函数,分别叫做mean函数和kernel函数。为了理解这一点,你可以想象你能从这个GP中采样出大量的函数,不妨称它们为f1(),f2(),...,fN()f_1(),f_2(),...,f_N()。如果你能在一个特定的xx^*中评估这N个函数,你会发现者N个函数的输出的平均值是m(x)m(x^*)。同样的,如果你在两个输入x1,x2x_1,x_2中评估这些函数,这些输出的协方差是k(x1,x2)k(x_1,x_2)

正如你可以从一个随机变量的分布中采样出一些值一样,你也可以从高斯过程中采样出函数。举个例子,如果你指定m(x)=0,k(x,x)MaternKernelm(x)=0,以及k(x,x')为Matern Kernel。你采样出来的函数可能长这样:

高斯过程是什么?

(source - scikit learn)

因此,一个高斯过程包括一个指定的先验分布,GPpriorGP_{prior}。然后以我们数据为条件,确定出一个函数的后验分布GPpostGP_{post}

在实际应用中,我们会使用一个向量对kernel进行参数化,然后选择一个可以最大化我们的数据和GPpostGP_{post}的特定向量。这个技术的真正艺术之处在于选择合适的Kernel function。

最后,我们将使用一个优化好的GPpostGP_{post},它可以由于评估任何给定的输入,我们不需要得到一个输出值,而是得到一个关于输出的分布。

好了,让我们现在来使用高斯过程吧!

下面是我6个月的体重:
高斯过程是什么?
你能看出什么规律么?其实我也看不出来。但是:

  1. 这些时刻很接近
  2. 这些时刻在一些周期的同一部分(一周或者一个月中的同一天等)

所以,让我们来构造出我们的kernel metric吧。

考虑到,这些时间特征并不是影响体重唯一的因素,应该还有其他特征来影响体重,所以我们应该在我们的kernel中加入一些噪音。

最后,我的体重应该有一些长期趋势,比如我可能在两周里吃了太多的披萨。或者我在某些日子生病了导致身体日渐消瘦。考虑到这些因素,我们将使用Matern Kernel。

好,现在让我们测试一下。我们将隐藏25%的数据用于预测。我将根据测试结果画出一个和两个标准偏差的置信区间。因此我们得到了:

高斯过程是什么?

从图中可以看出规律已经比较清晰了。我的体重大约有个时长一周的周期,并且会在几周内趋于正常。 样本不足,我们得到了不错的预测,因为它依赖于周期性并且不会从虚假的趋势中推断出来。分布的输出似乎对数据进行了很好的校准。

总之,高斯过程很灵活,你可以将你的一些直觉插入模型中,用于解决一些小问题。但是这不是一个通用的模型,他的拓展性不太好。