簡體   English   中英

如何將 scipy.optimize.fmin 與向量而不是標量一起使用

[英]How to use scipy.optimize.fmin with a vector instead of a scalar

在使用 Scipy 的 fmin function 時,我一直遇到錯誤消息:ValueError: setting an array element with a sequence 我已經看到這個問題已經被問過幾次了,我讀過一些有趣的帖子,例如:

..並嘗試實施建議的解決方案,例如將“*args”添加到成本 function,將成本 function 中的變量附加到列表並將變量矢量化。 但到目前為止,沒有什么對我有用。

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

目標:我正在嘗試獲得指數 function 'expo3'(需要 5 個調整點,由水平軸上的向量'M_test'和垂直軸上的'R_test'定義。 調整點 (M_test,R_test) 我試圖最小化的是 function 'expo3' 和調整點之間的差異。 所以,指數圖的意思是go盡量靠近調整點,比如: 實現“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 可以用來完成這個任務嗎? 有沒有可行的替代方案? 任何有關如何解決此問題的幫助將不勝感激。

如評論中所述,您的 function 必須返回單個值。 假設您要執行經典的最小二乘擬合,您可以修改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 允許您直接提供 ZC1C425268E68385D1AB5074C17A94F 的樣本點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM