繁体   English   中英

Scipy.least_squares 给出“ValueError:残差在初始点不是有限的。” 当错误 function 的初始评估是有限的时

[英]Scipy.least_squares giving "ValueError: Residuals are not finite in the initial point." when the initial evaluation of the error function is finite

我正在使用 scipy.least_squares 最小化算法将复杂的 model 拟合到某些数据。 model 本身使用正向欧拉方法求解微分方程,在 3 组不同的初始条件下,每组对应于我试图拟合的一组数据。 错误 function 计算计算每组初始条件的数据和模拟之间的差异并将它们连接起来。 目标是优化 4 个均为正的参数。 当我运行最小二乘算法时,它返回错误“ValueError:残差在初始点不是有限的。”。 但是,我的测试表明情况并非如此。

为简单起见,我将省略 model 本身的详细信息,但我有一个名为 errfunc 的预定义 function,它将参数数组作为第一个参数,并将 t(时间)和 y 数据集作为附加 arguments。此 function 返回 1D残差数组(模型 - 数据),由每组初始条件的残差串联组成。 为了运行优化,我的代码看起来有点像这样:

param = np.array([param1_init, param2_init, param3_init, param4_init])

result = least_squares(errfunc, param, bounds=(0,np.inf), args=(t_data1, y_data1, t_data2, y_data2, t_data3, y_data3))

据我了解,这个错误表明当第一次评估错误 function 的值时,返回了一些 NaN 或无限值。 但是,我知道情况并非如此,当我在初始点自己运行错误 function 时,它返回一个有限数组,这样

residual = errfunc(param, t_data1, y_data1, t_data2, y_data2, t_data3, y_data3)
print(np.all(np.isfinite(residual)))

返回真。 我还可以 plot 初始参数的残差,这表明它们相当小并且具有预期的形状,表明 model 正在按设计工作。

plt.plot(residual)

返回:初始参数值处的残差图

我的问题是是否有任何我没有考虑过的问题可能会返回此错误?

对于与此非常相似的 model,优化工作完美。 model 的唯一区别是微分方程中的附加项和要优化的额外参数。 我唯一的想法是非常大和非常小的参数值可能在起作用。 我引入的附加参数有一个非常小的正值(通常在 1e-29 左右),但正如我所展示的,这个比例的值从 model 产生了合理的结果。这是否会影响最小二乘算法并导致它提高这个错误?

我找到了解决问题的方法。 当将参数值的下限设置为 0 时,least_squares 似乎正在更改赋予错误 function 的初始参数,使它们大于或等于 1e-10。 因此,我的 model(期望参数值小得多)无法正常工作并返回非有限值。

删除边界并没有解决这个问题,因为错误 function 会在第一次正确评估,但对于后来的迭代,它增加了最小参数的值太多,并引发了同样的错误。

为了解决这个问题,我在将参数传递给 least_squares 之前手动放大了参数,并在将错误 function 传递给我的 model 之前取消了缩放。

根据 Scipy 文档,least_squares 中的 x_scale 参数执行这种缩放,但我发现使用这种方法我的参数初始值仍在更改并且错误仍在引发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM