高斯过程回归的matlab代码调试,不知道怎么设置参数,没有出现预期效果?

用高斯过程回归做预测,不会调matlab代码,一直找不来原因
关注者
54
被浏览
34,375

5 个回答

首先不知道你具体用的是那个代码包,我用过的主要是GMPL和GPstuff,都挺不错的内容也挺全的,但是在具体的方面各有千秋吧,下面有链接。
gpml: Documentation for GPML Matlab Code
GPstuff: GPstuff

不过,代码包其实不是重点,重点是实现的途径。总的来说,Gaussian Process Regression (GPR) 的整体流程是:

  1. 假设联合高斯分布,确定含参数的mean function and covariance function (kernel),然后确定模型noisy or not,当然这些一般情况下没有什么疑问,大多数关于GPR的文章和书都有的。
  2. 利用training set中对应的inputs, outputs去训练整个模型。这里就有很大的差别了,虽然说gp本来就是noparamatric的,也就是说不用估计参数,直接根据先验去算后验的积分,比如Neal用的MCMC的方法, arxiv.org/abs/physics/9 。 但是,但是MCMC毕竟是一个非常耗费时间的方法,所以一般情况下,我们仍然会选择去估计参数,也就是那些在mean function 和 kernel 里面的未知参数。这里具体利用的还是maximum likelihood。但是问题又来了,由于likelihood function的形式不同,不总是convex的,所以这个优化问题会存在一定的问题。具体的说最后找到的或许只是局部最优解而不是全局最优解,当然事实上我们需要的就是global 。也正是因为这个原因,所以这个问题的就会变成一个初值敏感的问题,也就是说你最后GPR 做的好坏也直接取决于你的这个初值选取的好坏。


3. 有具体的参数或者先验,自然根据模型非常容易去做下一步的问题了哈。

-----------------------------------------------分割线-------------------------------------------------------------

之前是理论的概括,下面是个人的经验。


  1. 初值敏感程度取决于kernel的选取, 个人结果是只要是Kernel不带periodic项的,几乎不太敏感。比如SE, RQ, Matern等等,但是只要是带有periodic项的都非常敏感,效果就是千差万别。所以你需要选取合适的kernel.
  2. 尽可能的克服敏感性的问题的主流解决方法就是在具体参数合理的取值范围内随机多次生成一些初始值, 然后进行算法,然后比较最后的likelihood,最后选取最好的。当然这里什么是合理的取值范围就需要结合具体问题具体分析了。
  3. 不知道你对于kernel 有什么深入理解么,比较推荐的一个核是wilson他的SM核。 Pattern Discovery with Gaussian processes 。 具体的内容他的网页里有提供具体的code,另外他还为他的SM核写一个比较合适的初值生成方法,而且实际的来说,SM核是一个非常强大的复合核,所以非常推荐。

个人认为GPML是在3个最常用的Matlab的GP toolbox(GPML,GP-LVM, GPStuff里)最简单易上手的,所以建议调参从GPML开始~

简单举例来说:

covfunc = {@covMaterniso, 3}; ell = 1; sf = 2; hyp.cov = log([ell; sf]);

likfunc = @likGauss; sn = 0.1; hyp.lik = log(sn);

hyp_updated = minimize(hyp, @gp, -100, @infGaussLik, [], covfunc, likfunc, xtr, ytr);

Step 1: 使用zero-mean function。优点:广泛使用、无需训练mean函数参数、结果准确

Step 2: 选定你喜爱的Covariance function(最常用的就是SE,这里推荐Matern,不会那么平滑),然后设置参数。通常isotropic covariance 函数有2个参数,第一个是length-scale, 简单来说就是the distance at which correlation几乎为0;第二个是variance;可以理解为这2个参数一个控制分布的延展/平滑、另一个控制振幅~

如果各个输入维度对输出的“贡献”不同,那就需要对每个输入维度都分别设置不同的length-scale值~

Step 3: 设置好likelihood函数,一般来说就是gaussian模型,参数就是那个variance

Step 4: 设置inference method,数据不太大就用exact inference

P.S. 更复杂的(譬如 如何设置参数prior distribution,如果选择哪一种covariance, likelihood, inference),还需要具体问题具体对待~,欢迎继续提出更加具体的问题~