[英]proper way to use curve_fit to fit a function that takes 1D array input and returns 2D array
我想使用scipy.optimize.curve_fit
來擬合2D數組(10x10數組),其函數定義如下
def musq(dz,y):
return 1.0/(1.0+y**2*(dz/dz[:,None])**2)
此函數musq
接受一維數組( dz=np.arange(0.1,1.1,0.1)
)並返回一個二維數組。 當我嘗試使用此函數擬合數據時,我得到ValueError: object too deep for desired array
無法放入ValueError: object too deep for desired array
。 我知道它一定與輸入和輸出形狀不匹配有關...
但是,將函數與返回2D數組的1D數組輸入擬合的正確方法是什么?
我的代碼和值如下
from scipy.optimize import curve_fit
dz=np.arange(0.1,1.1,0.1)
dat=np.mgrid[0.1:1.1:0.1,0.1:1.1:0.1][0]
ans=curve_fit(musq,dz,dat)
曲線擬合並不是真正針對此類問題的,但幸運的是,您發現它只是簡單地調用了可用於解決問題的引擎蓋下的least_squares
from scipy.optimize import least_squares
import numpy as np
def musq(x, param):
return 1.0/(1.0+param**2*(x/x[:,None])**2)
x = np.arange(0.1,1.1,0.1)
param = np.arange(10)
y = musq(x, param)
result = least_squares(lambda param: musq(x, param).ravel() - y.ravel(),
x0=np.zeros_like(param))
這似乎給出正確的結果:
>>> result.x
array([ 0. , 1. , 2. , 3. , 4. ,
5. , 6. , 7. , 7.99999996, 8.99999922])
根據@Jonas Adler的回答,將ravel()
添加到函數返回以及數據中似乎直接解決了curve_fit
。 這是我的解決方案(盡管在這種情況下,解決方案似乎不太適合)
from scipy.optimize import curve_fit
def musq(dz,y):
res=1.0/(1.0+y**2*(dz/dz[:,None])**2)
return res.ravel()
dz=np.arange(0.1,1.1,0.1)
dat=np.mgrid[0.1:1.1:0.1,0.1:1.1:0.1][0]
dat=dat.ravel()
ans=curve_fit(musq,dz,dat)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.