我正在尝试将 sigmoid 曲线拟合到一小组点上,基本上从一组观察中生成概率曲线。我正在使用scipy.optimize.curve_fit, 带有稍微修改的逻辑函数(以便完全绑定在 [0,1] 内)。目前,我在 dogbox 方法和精确的 tr_solver 方面取得了最大的成功。
当我尝试运行代码时,对于某些数据点,它会引发:
ValueError: `x0` violates bound constraints.
Run Code Online (Sandbox Code Playgroud)
我没有遇到这个问题(使用相同的代码和数据),直到我更新到最新版本的 numpy/scipy(numpy 1.17.0,scipy 1.3.1),所以我相信这是这次更新的结果(我无法降级,因为我需要用于该项目其他方面的其他库需要这些版本)
我在一个大型数据集 (N ~15000) 上运行它,对于非常具体的值,曲线拟合失败,声称初始猜测超出了边界约束。事实并非如此,甚至在提供的示例中拟合曲线之前通过打印语句快速检查也证实了这一点。
起初我认为这是一个 numpy 精度错误,这么小的值被认为是越界的,但是稍微改变它或提供一个新的、类似大小的任意数字不会导致 ValueError。此外,其他失败的值与 ~1e-10 一样大,所以我认为它一定是别的东西。
这是一个每次都失败的例子:
import numpy as np
import scipy as sp
from scipy.special import expit, logit
import scipy.optimize
def f(x,x0,g,c,k):
y = c*expit(k*10.*(x-x0)) + g*(1.-c)
return y
# x0 g c k
p0 = np.array([8.841357069490852e-01, 4.492363462957287e-19, 5.547073496706608e-01, 7.435378446218519e+00])
bounds = np.array([[-1.,1.], [0.,1.], [0.,1.], [0.,20.]])
x = np.array([1.0, 1.0, 1.0, 1.0, …Run Code Online (Sandbox Code Playgroud)