前言:在使用HEBO以及GPy包时遇到的错误,网上的解决办法有很多。
尝试办法1:
GPy在github中的第660条issue,提供了增大jitter大小,或者是用np的cholesky分解替代scipy的cholesky分解,等等。但依然报错LinAlgError("not positive definite, even with jitter.") · Issue #660 · SheffieldML/GPy
尝试办法2:
或者是用其他分解代替cholesky分解,如np的伪逆分解pinv,svd分解,但是还是不行,会继续报别的错或者是同样的错误。
尝试办法3:
还有解决办法加噪声,比如换核函数,用RBF+WhiteNoise,或者在RBF函数中加入噪声选项,并进行赋值,如0.2或更小的噪声值。但依旧报错。
分析原因:报错意思是矩阵非正定(not positive definite),通过往矩阵对角上增加微小扰动或者是数值依然矩阵非正定(even with jitter)。根据上述办法1和2可以得知,在我给出的数据上进行高斯过程建模是不可行,非正定无法修正。而办法3是直接从数据上入手,但加噪声的办法还是太柔和了,说明数据有问题!
发现问题:分析数据就发现问题了,我处理的是带约束的优化问题,为了加快找到合法解,我给的罚函数系数过大,而罚函数的数值之间的数量级差别达到了10e4,就会造成数据的陡降或陡升,导致高斯过程模型无法建模。即说明数据缺乏预处理,或者是预筛选,出现了数值异常的数据。
解决办法:根据上述分析,解决办法就很容易了,将罚函数归一化,将罚函数数值控制在相对小的范围内,或者修改罚函数系数,将它变小,减小罚函数对目标值的影响,或者简单粗暴的直接将罚函数去掉,找到合法解后在进行局部搜索。