如何使用scipy.optimize.fmin来代替向量而不是标量?

问题描述 投票:0回答:1

当使用Scipy的fmin函数时,我一直遇到错误信息。ValueError: setting an array element with a sequence我看到这个问题已经被问过好几次了,我也读到了一些有趣的帖子,例如

......并尝试实施建议的解决方案,如在成本函数中添加 "*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 "定义) 。Adjustment points (M_test,R_test)我试图最小化的是函数'expo3'和调整点之间的差值。因此,指数图应该尽可能地接近调整点,如。Exponential curve that accomplishes the minimisation of 'expo3-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可以用来完成这个任务吗?有什么可行的替代方案吗?任何关于如何解决这个问题的帮助都将非常感激。

python scipy exponential scipy-optimize
1个回答
1
投票

正如commments中提到的,你的函数必须返回一个单一的值。假设你想执行一个经典的最小二乘法拟合,你可以修改 func 以还正是。

  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,允许你直接提供函数骨架+样本点来适应。

© www.soinside.com 2019 - 2024. All rights reserved.