LinAlgError(“not positive definite, even with jitter.“)贝叶斯优化,高斯过程

前言:在使用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,就会造成数据的陡降或陡升,导致高斯过程模型无法建模。即说明数据缺乏预处理,或者是预筛选,出现了数值异常的数据。

解决办法:根据上述分析,解决办法就很容易了,将罚函数归一化,将罚函数数值控制在相对小的范围内,或者修改罚函数系数,将它变小,减小罚函数对目标值的影响,或者简单粗暴的直接将罚函数去掉,找到合法解后在进行局部搜索。

### 回答1: 这个错误提示意味着numpy的线性代数库在进行奇异值分解(SVD)时没有收敛,即算法无法得出稳定的结果。 通常,出现这个错误的原因可能是矩阵过大,或者矩阵中有过多的奇异值,使得算法无法正确处理。解决这个问题的方法可能包括使用更高效的奇异值分解算法,或者对矩阵进行预处理以减少奇异值的数量。 此外,还有可能是数据本身存在问题,例如有缺失值或异常值,也可能导致奇异值分解失败。在这种情况下,需要先对数据进行处理或清洗,以便能够正确地进行奇异值分解。 ### 回答2: numpy.linalg.linalgerror: svd did not converge。这个错误是在进行矩阵奇异值分解(Singular Value Decomposition,SVD)时出现的。SVD是矩阵分解的一种方法,它将任何矩阵分解成三个矩阵的积:一个左奇异矩阵、一个右奇异矩阵和一个对角线上是奇异值(Singular Value)的矩阵。 在使用SVD时,会遇到奇异矩阵无法收敛的情况,这种情况非常罕见,一般是由于矩阵的性质不够好。在实际应用中,通常可以通过以下几种方式来解决这个问题: 1. 检查数据的有效性:在使用SVD进行分解之前,应该检查数据是否有明显的异常值、缺失值或者不完整的数据。如果出现了这些问题,很可能会导致SVD无法收敛。需要对数据进行清理和处理。 2. 减小矩阵的维度:如果矩阵的维度非常高,可以考虑通过特征提取或者降维的方式来降低矩阵的维度,从而使SVD更容易收敛。 3. 选择其他的奇异值分解方法:如果SVD无法收敛,可以尝试使用其他的矩阵分解方法,比如QR分解或者LU分解。 4. 调整参数:在使用SVD时,可以尝试调整一些参数,比如tol、max_iter等参数,从而使算法更容易收敛。 总之,numpy.linalg.linalgerror: svd did not converge这个错误出现的原因比较复杂,需要具体情况具体分析。在实际应用中,需要仔细检查数据和算法,然后尝试不同的解决方案,才能解决这个问题。 ### 回答3: numpy.linalg.linalgerror: svd did not converge 是一个 numpy 包中出现的错误提示信息,表明了在进行奇异值分解(SVD)操作过程中,该操作无法达到收敛状态。奇异值分解是一种矩阵分解方式,用于找到一个矩阵的奇异值和奇异向量。这个分解方式在数学上非常重要,被广泛用于科学计算和工程领域。 SVD 的算法是一个迭代式的过程,在过程中会对矩阵进行逐步缩减,直到矩阵达到一个指定的阈值或者收敛状态。当出现 numpy.linalg.linalgerror: svd did not converge 这个错误提示时,说明在迭代过程中,矩阵没有收敛,可能有以下几个原因: 1. 矩阵过于复杂:在进行奇异值分解时,可能会碰到一些非常复杂的矩阵,这些矩阵的特征值和特征向量十分复杂,从而导致分解过程无法收敛。 2. 矩阵过于稀疏:如果矩阵中有很多零元素,可能会导致在进行 SVD 分解过程中,迭代过程过于复杂,从而导致无法收敛。 3. 不同的矩阵分解算法:SVD 算法有多种不同的实现方式,在不同的实现方式中,可能会出现收敛性能差异,可能导致某些算法无法达到目标收敛精度。 如果出现了这个错误提示,我们可以尝试以下方法: 1. 调整收敛阈值:运行时,可以尝试调整收敛的阈值,适当降低该值,从而使得 SVD 分解过程加速收敛。 2. 使用其他算法:如果使用的 SVD 算法无法收敛,可以尝试使用其他的矩阵分解算法,如 QR 分解、LU 分解等。 3. 增大计算精度:通过提高计算精度,可以使得 SVD 分解过程更加稳定,降低迭代过程中的收敛难度。 numpy.linalg.linalgerror: svd did not converge 这个错误提示表明了在进行 SVD 分解过程中出现的问题,使用以上方法可以帮助我们解决这个问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值