Python scipy.optimize.minimize收敛问题
我有一个我希望优化的函数,但它返回Python scipy.optimize.minimize收敛问题,python,numpy,statistics,scipy,Python,Numpy,Statistics,Scipy,我有一个我希望优化的函数,但它返回nans 以下是函数(fnRestrictParams是一个辅助函数): 测试此功能的数据为 我知道这个函数工作正常,因为我已经将输出与原始作者提供的实现(用另一种编程语言)进行了比较 但是,当我尝试使用scipy.optimize.minimize优化此函数时: # optimize the function without the gradient spoGC = spo.minimize(fnGASGaussianCopulaLikelihood, np.
nan
s
以下是函数(fnRestrictParams
是一个辅助函数):
测试此功能的数据为
我知道这个函数工作正常,因为我已经将输出与原始作者提供的实现(用另一种编程语言)进行了比较
但是,当我尝试使用scipy.optimize.minimize
优化此函数时:
# optimize the function without the gradient
spoGC = spo.minimize(fnGASGaussianCopulaLikelihood, np.array([0.005,-5,5.0]),
args = (int(mData.shape[0]), mData[:, [0, 1]]),
method = 'BFGS', options = {'disp': True, 'gtol': 1e-10, 'eps': 1e-10})
我得到:
Optimization terminated successfully.
Current function value: nan
Iterations: 0
Function evaluations: 5
Gradient evaluations: 1
Out[34]:
(array([ 0.005 , 1.0067607 , 0.72974065]),
nan,
array([ nan, nan, nan]),
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]),
5,
1,
0)
这显然是不好的。我无法找出导致此问题的原因。任何帮助都将不胜感激 嗯,函数返回的是
nan
,因此存在问题。调试函数内部停止的最小化代码。复制导致异常的函数的输入。然后您就知道函数的哪些值不起作用,您可以进一步调查函数是如何失败的。@gg349您完全正确。接下来的问题是我应该如何处理NaN
s。我在R中编写了相同的函数,R的BFGS实现没有问题。我是否应该在函数中检查是否返回了NaN
,并将其设置为一些较大的正值,以阻止BFGS尝试探索该部分参数空间?在Python中是否有一个更健壮的BFGS实现(例如R的optim
),当遇到NaN
s时,它会返回到最后一步?如果有必要,我可以提供R代码。1)是的,这是一种选择,我会选择;2) 我不明白为什么这个解决方案不可靠;3) 我不知道R中的optim是如何处理nans的,我无法想象它是如何工作的,但我看不出这是一个多么好的特性,它会夺走你的力量。简单地说,我不知道有任何针对返回无效值的函数的优化算法。这个论点超越了编码。
# optimize the function without the gradient
spoGC = spo.minimize(fnGASGaussianCopulaLikelihood, np.array([0.005,-5,5.0]),
args = (int(mData.shape[0]), mData[:, [0, 1]]),
method = 'BFGS', options = {'disp': True, 'gtol': 1e-10, 'eps': 1e-10})
Optimization terminated successfully.
Current function value: nan
Iterations: 0
Function evaluations: 5
Gradient evaluations: 1
Out[34]:
(array([ 0.005 , 1.0067607 , 0.72974065]),
nan,
array([ nan, nan, nan]),
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]),
5,
1,
0)