使用scipy.optimize.fmin的常见问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用scipy.optimize.fmin的常见问题相关的知识,希望对你有一定的参考价值。

当将以下代码从MATLAB转换为Python时,我遇到了一些问题:

Matlab代码段:

   x=M_test %M_test is a 1x3 array that holds the adjustment points for the function
   y=R_test %R_test is also a 1x3 array
   >> M_test=[0.513,7.521,13.781]
   >> R_test=[2.39,3.77,6.86]

   expo3= @(b,x) b(1).*(exp(-(b(2)./x).^b(3)));
   NRCF_expo3= @(b) norm(y-expo3(b,x));
   B0_expo3=[fcm28;1;1];
   B_expo3=fminsearch(NRCF_expo3,B0_expo3);
   Data_raw.fcm_expo3=(expo3(B_expo3,Data_raw.M));

翻译后的(python)代码:

   expo3=lambda x,M_test: x[0]*(1-exp(-1*(x[1]/M_test)**x[2]))
   NRCF_expo3=lambda R_test,x,M_test: np.linalg.norm(R_test-expo3,ax=1)
   B_expo3=scipy.optimize.fmin(func=NRCF_expo3,x0=[fcm28,1,1],args=(x,))

[为了清楚起见,目标函数'expo3'要通过M_test定义的调整点。'NRCF_expo3'是要最小化的函数,基本上是R_test和绘制的指数函数之间的错误。

运行代码时,出现以下错误消息:

B_expo3=scipy.optimize.fmin(func=NRCF_expo3,x0=[fcm28,1,1]),args=(x,))
NameError: name 'x' is not defined

我细读过很多类似的问题。

如果我从优化函数中删除'args',因为numpy/scipy analog of matlab's fminsearch 似乎表明没有必要,则出现错误:

line 327, in function_wrapper
return function(*(wrapper_args+args))
TypeError: <lambda>() missing 2 required positional arguments: 'x' and 'M_test'

[我尝试了很多其他修改,例如Using scipy to minimize a function that also takes non variational parametersOpen source examples中的例子,但对我而言无效。

我希望这很明显,但是我对Python还是陌生的,我觉得我正在大海捞针。 我没看到什么?

任何帮助将不胜感激。如果需要,我还可以提供更多代码。

答案
我认为您不应在代码中使用lambda,而应使用三个参数来使目标函数成为单一目标(请参见PEP8)。您的帖子中有很多缺失的信息,但是据我所推断,您想要这样的东西:

from scipy.optimize import fmin # Define parameters M_TEST = np.array([0.513, 7.521, 13.781]) X_ARR = np.array([2.39,3.77,6.86]) X0 = np.array([10, 1, 1]) # whatever your variable fcm28 is def nrcf_exp3(r_test, m_test, x): expo3 = x[0] * (1 - np.exp(-(x[1] / m_test) ** x[2])) return np.linalg.norm(r_test - expo3) fmin(nrcf_exp3, X0, args=(M_TEST, X_ARR))

以上是关于使用scipy.optimize.fmin的常见问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥我从 scipy.optimize.fmin 得到不正确的结果?

Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()

矩阵未对齐错误:Python SciPy fmin_bfgs

最小化器背后的直觉

Python中的约束最小二乘估计

c++面试常见300问