使用 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",作为 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'

我尝试过许多其他修改,例如使用 scipy 最小化也采用非变分参数的函数或开源示例中的函数,但对我来说没有任何用处。

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

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

我认为你不应该在你的代码中使用lambdas,而是用你的三个参数制作一个目标函数(参见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))

最新更新