简体   繁体   English

使用 scipy.optimize.fmin 经常出现的问题

[英]Recurrent problem using scipy.optimize.fmin

I am encountering some problems when translating the following code from MATLAB to Python:在将以下代码从 MATLAB 转换为 Python 时,我遇到了一些问题:

Matlab code snippet: 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));

The translated (python) code:翻译后的(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,))

For clarity, the object function 'expo3' wants to go through the adjustment points defined by M_test.为了清楚起见,object function 'expo3' 想通过 M_test 定义的调整点来 go。 'NRCF_expo3' is the function that wants to be minimised, which is basically the error between R_test and the drawn exponential function. 'NRCF_expo3'是想要最小化的function,基本上就是R_test和绘制的指数function之间的误差。

When I run the code, I obtain the following error message:当我运行代码时,我收到以下错误消息:

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

There are a lot of similar questions that I have perused.我已经阅读了很多类似的问题。

If I delete the 'args' from the optimization function, as numpy/scipy analog of matlab's fminsearch seems to indicate it is not necessary, I obtain the error:如果我从优化 function 中删除“args”,因为matlab 的 fminsearch 的 numpy/scipy 模拟似乎表明没有必要,我得到错误:

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

There are a lot of other modifications that I have tried, following examples like Using scipy to minimize a function that also takes non variational parameters or those found in Open source examples , but nothing works for me.我尝试了很多其他修改,例如使用 scipy 来最小化 function 也采用非变分参数或在开源示例中找到的参数,但对我没有任何作用。

I expect this is probably quite obvious, but I am very new to Python and I feel like I am looking for a needle in a haystack.我希望这可能很明显,但我对 Python 很陌生,我觉得我正在大海捞针。 What am I not seeing?我没看到什么?

Any help would be really appreciated.任何帮助将非常感激。 I can also provide more code, if that is necessary.如果有必要,我还可以提供更多代码。

I think you shouldn't use lambdas in your code, make instead a single target function with your three parameters (see PEP8 ).我认为您不应该在代码中使用 lambda,而是使用您的三个参数(请参阅PEP8 )创建一个目标 function 。 There is a lot of missing information in you post, but for what I can infer, you want something like this:你的帖子中有很多缺失的信息,但据我所知,你想要这样的东西:

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))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM