【发布时间】:2020-10-01 02:01:35
【问题描述】:
在使用 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)
目标:我试图获得一个指数函数“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 来完成这项任务吗?有没有可行的替代方案? 任何有关如何解决此问题的帮助将不胜感激。
【问题讨论】:
-
M_test和R_test是长度为 5 的数组,因此您的函数func的返回值是一个长度为 5 的数组。fmin要求目标函数返回一个标量。 -
将对象函数和 fmin 函数放在一个从 0 到 M_test 长度的循环中是否可行?
-
这取决于。我认为如果您提供有关您要解决的问题的更多背景信息,那么有人会更容易帮助您。你想达到什么目的?独立于它在 Python 代码中的实现,你试图最小化什么,为什么? (如果你能回答这个问题,最好在问题中提供上下文,而不是在 cmets 中。)
-
注明。我修改了问题,使其包含目标。
标签: python scipy exponential scipy-optimize