如何将 scipy.optimize.fmin 与矢量而不是标量一起使用
How to use scipy.optimize.fmin with a vector instead of a scalar
在使用Scipy的fmin函数时,一直报错:ValueError: setting an array element with a sequence
我看到这个问题已经被问过好几次了,我也阅读了一些有趣的帖子,例如:
- ValueError: setting an array element with a sequence
- Scipy optimize fmin ValueError: setting an array element with a sequence
- Scipy minimize fmin - problems with syntax
..并尝试实施建议的解决方案,例如将“*args”添加到成本函数,将成本函数中的变量附加到列表并将变量向量化。但到目前为止,没有任何事情对我有用。
我对 Python 中的编程还很陌生,所以我可能已经阅读了解决方案但不知道如何应用它。
代码的简化版,我用来找问题的,如下:
import numpy as np
import scipy.optimize
from scipy.optimize import fmin
fcm28=40
M_test=np.array([32.37,62.54,208,410,802])
R_test=np.array([11.95,22.11,33.81,39.18,50.61])
startParams=np.array([fcm28,1,1])
def func(xarray):
x=xarray[0]
y=xarray[1]
z=xarray[2]
expo3=x*np.exp(-(y/M_test)**z)
cost=expo3-R_test
return cost
### If I write the following lines of code:
# xarray=(100,290,0.3)
# print(func(xarray))
# >> [ 2.557 -1.603 -0.684 1.423 -2.755] #I would obtain this output
func_optimised=fmin(func,x0=[fcm28,1,1],xtol=0.000001)
Objective: 我正在尝试获得一个指数函数 'expo3'(需要 5 个调整点,由向量 'M_test' 定义水平轴和垂直轴 'R_test'。
我试图最小化的是函数 'expo3' 和调整点之间的差异。
因此,指数图旨在尽可能接近调整点,例如:
我收到以下错误消息:
File "Example2.py", line 20, in <module>
func_optimised=fmin(func,x0=[fcm28,1,1],xtol=0.000001)
File "/home/.../python3.6/site-packages/scipy/optimize/optimize.py", line 443, in fmin
res=_minimize_neldermead(func,x0,args,callback=callback,**opts)
File "/home/.../python3.6/site-packages/scipy/optimize/optimize.py" line 586, in _minimize_neldermead
fsim[k] = func(sim[k])
ValueError: setting an array element with a sequence.
fmin 可以用来完成这个任务吗?有没有可行的替代方案?
任何有关如何解决此问题的帮助将不胜感激。
如评论中所述,您的函数必须 return 单个值。假设您想执行经典的最小二乘法拟合,您可以将 func
修改为 return 只是这样:
def func(...):
# ... identical lines skipped
cost = sum((expo3-R_test)**2)
return cost
随着这一变化,func_optimised
变为:
array([1.10633369e+02, 3.85674857e+02, 2.97121854e-01])
# or approximately (110.6, 385.6, 0.3)
就像一个指针:你也可以使用 scipy.optimize.curve_fit
来做基本相同的事情,但是更好的 API 允许你直接提供函数骨架 + 样本点来适应.
在使用Scipy的fmin函数时,一直报错:ValueError: setting an array element with a sequence 我看到这个问题已经被问过好几次了,我也阅读了一些有趣的帖子,例如:
- ValueError: setting an array element with a sequence
- Scipy optimize fmin ValueError: setting an array element with a sequence
- Scipy minimize fmin - problems with syntax
..并尝试实施建议的解决方案,例如将“*args”添加到成本函数,将成本函数中的变量附加到列表并将变量向量化。但到目前为止,没有任何事情对我有用。
我对 Python 中的编程还很陌生,所以我可能已经阅读了解决方案但不知道如何应用它。
代码的简化版,我用来找问题的,如下:
import numpy as np
import scipy.optimize
from scipy.optimize import fmin
fcm28=40
M_test=np.array([32.37,62.54,208,410,802])
R_test=np.array([11.95,22.11,33.81,39.18,50.61])
startParams=np.array([fcm28,1,1])
def func(xarray):
x=xarray[0]
y=xarray[1]
z=xarray[2]
expo3=x*np.exp(-(y/M_test)**z)
cost=expo3-R_test
return cost
### If I write the following lines of code:
# xarray=(100,290,0.3)
# print(func(xarray))
# >> [ 2.557 -1.603 -0.684 1.423 -2.755] #I would obtain this output
func_optimised=fmin(func,x0=[fcm28,1,1],xtol=0.000001)
Objective: 我正在尝试获得一个指数函数 'expo3'(需要 5 个调整点,由向量 'M_test' 定义水平轴和垂直轴 'R_test'。
我收到以下错误消息:
File "Example2.py", line 20, in <module>
func_optimised=fmin(func,x0=[fcm28,1,1],xtol=0.000001)
File "/home/.../python3.6/site-packages/scipy/optimize/optimize.py", line 443, in fmin
res=_minimize_neldermead(func,x0,args,callback=callback,**opts)
File "/home/.../python3.6/site-packages/scipy/optimize/optimize.py" line 586, in _minimize_neldermead
fsim[k] = func(sim[k])
ValueError: setting an array element with a sequence.
fmin 可以用来完成这个任务吗?有没有可行的替代方案? 任何有关如何解决此问题的帮助将不胜感激。
如评论中所述,您的函数必须 return 单个值。假设您想执行经典的最小二乘法拟合,您可以将 func
修改为 return 只是这样:
def func(...):
# ... identical lines skipped
cost = sum((expo3-R_test)**2)
return cost
随着这一变化,func_optimised
变为:
array([1.10633369e+02, 3.85674857e+02, 2.97121854e-01])
# or approximately (110.6, 385.6, 0.3)
就像一个指针:你也可以使用 scipy.optimize.curve_fit
来做基本相同的事情,但是更好的 API 允许你直接提供函数骨架 + 样本点来适应.