簡體   English   中英

使用curve_fit來擬合需要一維數組輸入並返回二維數組的函數的正確方法

[英]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.

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