Python Scpiy:scipy.optimize.minimize的奇怪行为

Python Scpiy:scipy.optimize.minimize的奇怪行为,python,scipy,Python,Scipy,我正在使用scipy.optimize.minimize进行缩小 在为我的目标函数f(x0)寻找合适的参数x0时,x0突然变化,值变成NaN,因此最小化方法停止 以下是奇怪行为之前的x0和结果系列: [ 0.1329492 0.13074885 -9.92951618 -1.15521653 5.74419133 4.11687514 0.19983624 -9.95148156 -1.18517543 5.69420641 3.91303028 0.19983624 -7.

我正在使用
scipy.optimize.minimize
进行缩小

在为我的目标函数
f(x0)
寻找合适的参数
x0
时,
x0
突然变化,值变成
NaN
,因此
最小化
方法停止

以下是奇怪行为之前的
x0
结果
系列:

[ 0.1329492   0.13074885 -9.92951618 -1.15521653  5.74419133  4.11687514
  0.19983624 -9.95148156 -1.18517543  5.69420641  3.91303028  0.19983624
 -7.34387457 -5.30116147  4.90141309  5.06593156  0.18205401] 267.765197762
[ 0.1329492   0.13074885 -9.92951618 -1.15521653  5.74419133  4.11687514
  0.19983624 -9.95148156 -1.18517543  5.69420641  3.91303028  0.19983624
 -7.34387457 -5.30116149  4.9014131   5.06593156  0.18205401] 267.76519813
[ 0.1329492   0.13074885 -9.92951618 -1.15521653  5.74419133  4.11687514
  0.19983624 -9.95148156 -1.18517543  5.69420641  3.91303028  0.19983624
 -7.34387457 -5.30116149  4.90141309  5.06593157  0.18205401] 267.765196949
[ 0.1329492   0.13074885 -9.92951618 -1.15521653  5.74419133  4.11687514
  0.19983624 -9.95148156 -1.18517543  5.69420641  3.91303028  0.19983624
 -7.34387457 -5.30116149  4.90141309  5.06593156  0.18205402] 267.765198923
[  5.93742471e-01   4.06257529e-01  -5.09322593e+00   1.73303924e+00
   3.56252177e+00   2.98573010e+00   1.26090655e-09  -4.85059563e+00
   1.22511256e+00   4.81903606e+00   2.51934646e+00   5.72130981e-10
  -1.06593289e+01   2.76365721e+00   4.63158974e+00   6.86179361e+00
   1.29879685e-09] nan
在改变
[0.1329492 0.13074885…
后,
x0
突然变为
[5.93742471e-01 4.06257529e-01…
,并返回
NaN

奇怪的是,目标方法
f(x0)
可以返回最后一个
x0
的值(
[5.93742471e-01 4.06257529e-01…])


我真的不知道该怎么办。

我不太确定原因是什么,因为我没有目标函数或对scipy.optimize.minimize()的调用,但我看到的是:

第一个和第二个到最后一个x在两个组件中仅相差1*10^-8。这似乎非常小

如果未另行指定,
minimize
将根据是否指定了约束来决定(查看文档字符串)。你很有可能最终得到BFG或类似的,基于梯度的。现在,如果你尝试根据前几次评估构建梯度,我可以看出,在如此小的间距下,这将导致疯狂的结果

问题是:你是否做了导致这些小的起始间隔的事情?你是否指定了要使用的算法?你是否指定了可能触发小的初始间隔的边界?通常,除非有充分的理由不去某个地方,否则不要设置边界。许多人只会基于“我认为这里没有好的解决方案”--这是一个坏习惯,并且混淆了许多算法

为了更好的分析,你应该发布更多的信息。
根据您的问题,您可能会发现,考虑到输入变量的数量,最小二乘法或单纯形优化器可能更好,甚至可能是遗传算法。

能够看到
最小化中指定的目标函数和参数将很有帮助,(例如
方法是什么?
(您尝试过其他方法吗)您是否设置了任何
界限
)听起来您认为问题与样本值的剧烈波动有关;设置
界限
参数可能会很有用