Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尽管x0在范围内,但Scipy optimize仍会引发ValueError_Python_Numpy_Scipy_Curve Fitting_Least Squares - Fatal编程技术网

Python 尽管x0在范围内,但Scipy optimize仍会引发ValueError

Python 尽管x0在范围内,但Scipy optimize仍会引发ValueError,python,numpy,scipy,curve-fitting,least-squares,Python,Numpy,Scipy,Curve Fitting,Least Squares,我试着将一条S形曲线拟合到一小组点上,基本上是从一组观测值生成一条概率曲线。我使用的是scipy.optimize.curve_fit,带有稍微修改的逻辑函数(以便完全绑定在[0,1]内)。目前,我在dogbox方法和精确的tr_解算器方面取得了最大的成功 当我尝试运行代码时,对于某些数据点,它将引发: ValueError: `x0` violates bound constraints. 在更新到最新版本的numpy/scipy(numpy 1.17.0,scipy 1.3.1)之前,我没

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

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

ValueError: `x0` violates bound constraints.
在更新到最新版本的numpy/scipy(numpy 1.17.0,scipy 1.3.1)之前,我没有遇到过这个问题(使用相同的代码和数据),因此我认为这是这次更新的结果(我不能降级,因为我需要用于此项目其他方面的其他库需要这些版本)

我在一个大数据集(N~15000)上运行这个,对于非常特定的值,曲线拟合失败,声称初始猜测超出了边界约束。事实并非如此,在所提供的示例中,即使在曲线拟合之前通过print语句快速检查也证实了这一点

起初,我认为这是一个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, 1.0, 0.8911796599834791, 1.0, 1.0, 1.0, 0.33232919909076103, 1.0])
y = np.array([0.999, 0.999, 0.999, 0.999, 0.999, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001])
s = np.array([0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9])

print([pval >= b[0] and pval <= b[1] for pval,b in zip(p0,bounds)])

fit,cov = sp.optimize.curve_fit(f,x,y,p0=p0,sigma=s,bounds=([b[0] for b in bounds],[b[1] for b in bounds]),method='dogbox',tr_solver='exact')

print(fit)
print(cov)
如果有人对造成这种情况的原因有任何见解,我将非常感谢您的帮助!我做了一些搜索,找不到任何可能与这个场景相关的答案,所以我决定打开这个问题。谢谢

19年9月9日编辑:
np.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我在64位Windows10上的Python3.6.6上运行这个

如果我将第二个或第四个边界更改为+/-np.inf(或同时更改这两个边界),那么代码实际上是完整的——但我仍然不确定x0是如何无效的(我仍然需要将拟合绑定到这些值)

编辑:1/22/20
np.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我已经为这个错误打开了窗口。然而,他们似乎也无法重现这个问题,因此无法解决它。

可怕的黑客攻击。不要在家里做:)但如果你只需要自己承担风险完成工作:

C:\Users\user\AppData\Local\Programs\Python\36\lib\site packages\scipy\optimize\\u numdiff.py

查找:

如果np.any((x0ub)):
raise VALUERROR(“`x0`违反了绑定约束。”)
替换为:

如果np.any((x0-lb)<-1e-12)|(x0>ub)):
raise VALUERROR(“`x0`违反了绑定约束。”)
其中,
-1e-12
是您认为您的案例可以容忍的约束错误
(x0 lb)<0
。这里,
x0
是一个猜测,
lb
是一个下限


我不知道这次黑客攻击会导致什么数字上的恐怖。但是,如果您只是想继续…

我可以确认发布的代码在numpy版本1.13.3和scipy版本0.19.1上运行到完成时没有错误。可以单独使每个绑定[-np.inf,np.inf]尝试并找到有问题的绑定,这很容易做到,可能会有所帮助。@JamesPhillips-Jepp,在Python2.7.14上使用NUMPY1.15.0和SCIPY1.1.0也可以使用。。
print()
suggestpython3?的使用与python3.6.5、numpy1.16.3和scipy1.3.0相同。。。作品但是,所有这些都在64位linux上。@AndrasDeak截至2020年1月22日,这个问题仍在发生,没有提出或找到其他解决方案(升级到numpy 1.18.1和scipy 1.4.1没有帮助)。根据您的建议,我在问题跟踪程序上打开了一个问题。这不是我的问题。在我的例子中,x0=4.15是边界的平均值(.8,7.5)。但还是出现了错误。
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.