0%

高斯过程新解

高斯过程(Gaussian Process)是一种灵活的非参数贝叶斯模型,广泛应用于回归、分类、优化和不确定性建模等领域。高斯过程可以被理解为对函数的概率分布建模。与传统的参数模型(如线性回归)不同,它不假设函数的具体形式,而是通过概率分布来描述所有可能的函数。

高斯过程的数学解释对于非数学专业的人们来说有点晦涩,本人发现通过物理类比讲解比较易懂。

空间中存在几个点源(类比电荷、热源等等都可以),经过传播我们知道了它们自身位置的函数值,那么如何求空间中任意一点的函数值?

点源在空间中的传播方式可以是高斯型、周期型、高斯+周期型等等,下面以高斯型为例,用Matgematica代码说明该问题的求解。


高斯型核函数

  • 空间中存在5个点源,位置为 ,经过传播后观测到这些位置的函数值为 。作为事例,是从函数 取点:
In[]:=
1
2
3
4
5
f[x_] = -0.5 x (x - 1) (x - 2) (x - 3.2);
xObs = {0.5, 0.8, 2, 2.2, 3};
yObs = f[xObs];
Show[{Plot[f[x], {x, -0.5, 3.5}],
ListPlot[Transpose[{xObs, yObs}]]}]

xf(x)0123-1-0.500.51

5个点源的值未知,但是知道经过高斯型传播之后的函数值。每个点源都对函数值都有贡献,核函数为高斯函数, 点到

上述系数可变,指数中分母的 b 代表传播的远近。传播矩阵为:

In[]:=
1
2
3
K = Table[
Exp[-(xObs[[i]] - xObs[[j]])^2/2],
{i, Length[xObs]}, {j, Length[xObs]}];

假设5个点源的值为 ,经过传播之后的值为 ,那么

就变成了解线性方程组, 的解为:

数值求解该线性方程组可以采用之前介绍的 《共轭梯度法数值求解线性方程组》《双共轭梯度法数值求解线性方程组》,以后也会介绍一种近似求解方法。

此时我们知道了5个点源的值,那么经过传播后,空间中任一点 的函数值 就知道了:

In[]:=
1
2
Ks[x_] = Exp[-(# - x)^2/2] & /@ xObs;
y[x_] = Ks[x] . LinearSolve[K, yObs];

方差为:

上式的 a 和核函数一致。

In[]:=
1
2
yVariance[x_] = 1 - Transpose[Ks[x]] . LinearSolve[K, Ks[x]];
yStd[x_] = Sqrt[yVariance[x]];

画图:

In[]:=
1
2
3
4
Show[{Plot[f[x], {x, -0.5, 3.5}, PlotRange -> {-0.5, 1}],
ListPlot[Transpose[{xObs, yObs}], PlotStyle -> Black],
Plot[{y[x], y[x] - yStd[x], y[x] + yStd[x]}, {x, -0.5, 3.5}
, Filling -> {2 -> {3}}, PlotStyle -> {Red, LightRed, LightRed}]}]

Plotly.js 画图真是累死人,不过可以进行运算。可以看出,距离观测点越远,方差范围越大,可信度也就越低。

也可以在x范围内取一些点:

In[]:=
1
2
3
4
5
6
7
8
9
10
11
12
xx = Range[-0.5, 3.5, 0.1];
KKs = Table[ Exp[-(xObs[[i]] - xx[[j]])^2/2],
{i, Length[xObs]}, {j, Length[xx]}];
KKss = Table[ Exp[-(xx[[i]] - xx[[j]])^2/2],
{i, Length[xx]}, {j, Length[xx]}];
yy = Transpose[KKs] . LinearSolve[K, yObs];
yyVariance = KKss - Transpose[KKs] . LinearSolve[K, KKs];
yyStd = Sqrt[Diagonal[yyVariance]];
Show[{Plot[f[x], {x, -0.5, 3.5}, PlotRange -> {-0.5, 1}],
ListPlot[Transpose[{xObs, yObs}], PlotStyle -> Black],
ListLinePlot[{Transpose[{xx, yy}], Transpose[{xx, yy - yyStd}], Transpose[{xx, yy + yyStd}]}
, Filling -> {2 -> {3}}, PlotStyle -> {Red, LightRed, LightRed}]}]

xf(x)0123-1-0.500.51

网页版 tikz 画图也挺累人的,凑合用吧。

周期型核函数

xf(x)0123-1-0.500.51

高斯+周期型核函数

xf(x)0123-1-0.500.51

原创内容转发请务必注明出处。请大家多多关注、点赞、收藏、转发,让更多有需要的人可以看到,以后会分享更多实用的算法。

万分感谢!🙏