本文译自: Duane Rich 的文章Which is your favorite Machine Learning algorithm?
几乎所有的有监督机器学习算法都专注于找到一个函数 f ( ) f() f(),这个函数是从特征 x i x_i xi到标签 y i y_i yi的映射的一个近似。通常情况下一个函数的参数决定了一个函数。根据数据,我们通过确定这些参数的(后验)分布来确定可能的函数。
高斯过程允许我们根据一组任意有限的输入和输出来引用函数。我们通过一个分布来指定函数:
f
(
x
)
=
G
P
(
m
(
x
)
,
k
(
x
,
x
′
)
)
f(x)=GP(m(x),k(x,x'))
f(x)=GP(m(x),k(x,x′))
其中
m
(
x
)
m(x)
m(x)和
k
(
x
,
x
′
)
k(x,x')
k(x,x′)是给定的函数,分别叫做mean函数和kernel函数。为了理解这一点,你可以想象你能从这个GP中采样出大量的函数,不妨称它们为
f
1
(
)
,
f
2
(
)
,
.
.
.
,
f
N
(
)
f_1(),f_2(),...,f_N()
f1(),f2(),...,fN()。如果你能在一个特定的
x
∗
x^*
x∗中评估这N个函数,你会发现者N个函数的输出的平均值是
m
(
x
∗
)
m(x^*)
m(x∗)。同样的,如果你在两个输入
x
1
,
x
2
x_1,x_2
x1,x2中评估这些函数,这些输出的协方差是
k
(
x
1
,
x
2
)
k(x_1,x_2)
k(x1,x2)。
正如你可以从一个随机变量的分布中采样出一些值一样,你也可以从高斯过程中采样出函数。举个例子,如果你指定 m ( x ) = 0 , 以 及 k ( x , x ′ ) 为 M a t e r n K e r n e l m(x)=0,以及k(x,x')为Matern Kernel m(x)=0,以及k(x,x′)为MaternKernel。你采样出来的函数可能长这样:
因此,一个高斯过程包括一个指定的先验分布, G P p r i o r GP_{prior} GPprior。然后以我们数据为条件,确定出一个函数的后验分布 G P p o s t GP_{post} GPpost。
在实际应用中,我们会使用一个向量对kernel进行参数化,然后选择一个可以最大化我们的数据和 G P p o s t GP_{post} GPpost的特定向量。这个技术的真正艺术之处在于选择合适的Kernel function。
最后,我们将使用一个优化好的 G P p o s t GP_{post} GPpost,它可以由于评估任何给定的输入,我们不需要得到一个输出值,而是得到一个关于输出的分布。
好了,让我们现在来使用高斯过程吧!
下面是我6个月的体重:
你能看出什么规律么?其实我也看不出来。但是:
- 这些时刻很接近
- 这些时刻在一些周期的同一部分(一周或者一个月中的同一天等)
所以,让我们来构造出我们的kernel metric吧。
考虑到,这些时间特征并不是影响体重唯一的因素,应该还有其他特征来影响体重,所以我们应该在我们的kernel中加入一些噪音。
最后,我的体重应该有一些长期趋势,比如我可能在两周里吃了太多的披萨。或者我在某些日子生病了导致身体日渐消瘦。考虑到这些因素,我们将使用Matern Kernel。
好,现在让我们测试一下。我们将隐藏25%的数据用于预测。我将根据测试结果画出一个和两个标准偏差的置信区间。因此我们得到了:
从图中可以看出规律已经比较清晰了。我的体重大约有个时长一周的周期,并且会在几周内趋于正常。 样本不足,我们得到了不错的预测,因为它依赖于周期性并且不会从虚假的趋势中推断出来。分布的输出似乎对数据进行了很好的校准。
总之,高斯过程很灵活,你可以将你的一些直觉插入模型中,用于解决一些小问题。但是这不是一个通用的模型,他的拓展性不太好。