Saya ingin menggunakan scipy.optimize.curve_fit agar sesuai dengan array 2D (array 10x10) dengan fungsi yang didefinisikan sebagai berikut

def musq(dz,y):
    return 1.0/(1.0+y**2*(dz/dz[:,None])**2)

Fungsi ini musq mengambil larik 1D (dz=np.arange(0.1,1.1,0.1)) dan mengembalikan larik 2D. Ketika saya mencoba menyesuaikan data dengan fungsi ini, saya mendapatkan ValueError: object too deep for desired array. Saya mengerti itu pasti ada hubungannya dengan ketidakcocokan bentuk input dan output ...

Tapi apa cara yang tepat untuk menyesuaikan fungsi dengan input array 1D yang mengembalikan array 2D?

Kode dan nilai saya adalah sebagai berikut

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)
2
Rohin Kumar 10 Agustus 2017, 19:17

2 jawaban

Jawaban Terbaik

Curve fit tidak benar-benar ditujukan untuk jenis masalah ini, tetapi untungnya Anda menemukan bahwa itu hanya memanggil least_squares yang dapat digunakan untuk memecahkan masalah

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

Yang tampaknya memberikan hasil yang benar:

>>> result.x
array([ 0.        ,  1.        ,  2.        ,  3.        ,  4.        ,
        5.        ,  6.        ,  7.        ,  7.99999996,  8.99999922])
3
Jonas Adler 10 Agustus 2017, 16:40

Berdasarkan jawaban oleh @Jonas Adler, menambahkan ravel() ke fungsi pengembalian serta data tampaknya melakukan trik untuk curve_fit secara langsung. Inilah solusi saya (walaupun dalam hal ini solusi tampaknya tidak cocok)

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)
0
Rohin Kumar 10 Agustus 2017, 17:58