尽管x0在范围内,Scipy优化仍会引发ValueError

2024-09-26 22:42:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把一条sigmoid曲线拟合到一小部分点上,基本上是从一组观测数据中生成一条概率曲线。我使用的是scipy.optimize.curve_fit,它有一个稍微修改过的logistic函数(以便完全绑定到[0,1])。目前,我在dogbox方法和一个精确的tr_解算器方面取得了最大的成功。在

当我尝试运行代码时,对于某些数据点,它将引发:

ValueError: `x0` violates bound constraints.

在更新到最新版本的numpy/scipy(numpy 1.17.0,scipy 1.3.1)之前,我没有遇到这个问题(使用相同的代码和数据),所以我认为这是这次更新的结果(我不能降级,因为我需要的其他库需要这些版本)

我在一个大型数据集(N~15000)上运行这个程序,对于非常具体的值,曲线拟合失败,声称初始猜测超出了限制条件。事实并非如此,甚至在提供的示例中的曲线拟合之前通过print语句快速检查也证实了这一点。在

一开始我认为这是一个小精度的错误,一个这么小的值被认为是越界的,但是稍微改变它或者提供一个新的,任意数量的类似大小不会导致值错误。另外,其他失败的值也有~1e-10那么大,所以我假设它一定是别的东西。在

这里有一个我每次都失败的例子:

^{pr2}$

下面是具体的错误堆栈,上面的一切调用后都要进行曲线拟合。在

File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\minpack.py", line 763, in curve_fit
  **kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\_lsq\least_squares.py", line 927, in least_squares
  tr_solver, tr_options, verbose)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\_lsq\dogbox.py", line 310, in dogbox
  J = jac(x, f)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\_lsq\least_squares.py", line 874, in jac_wrapped
  kwargs=kwargs, sparsity=jac_sparsity)
File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\scipy\optimize\_numdiff.py", line 362, in approx_derivative
  raise ValueError("`x0` violates bound constraints.")
ValueError: `x0` violates bound constraints.

如果有人知道是什么原因造成的,我将非常感谢你的帮助!我做了一些搜索,没有找到任何可能与这个场景有关的答案,所以我决定打开这个问题。谢谢!在

编辑9/9/19: np.__version__是1.17.2,sp.__version__是1.3.1,当我最初发布这篇文章时,我在numpy 1.17.0上,但是升级并没有解决这个问题。我在64位Windows10上的Python3.6.6上运行这个。在

如果我改变第二个或第四个+/-np.inf公司(或者两者都更改),那么代码实际上就完成了——但是我仍然不确定x0是如何无效的(我仍然需要将拟合限制在这些值上)


Tags: inpylibpackageslocallinesitescipy

热门问题