【问题标题】:proper way to use curve_fit to fit a function that takes 1D array input and returns 2D array使用curve_fit拟合接受一维数组输入并返回二维数组的函数的正确方法
【发布时间】:2017-08-10 16:17:02
【问题描述】:

我想使用scipy.optimize.curve_fit 来拟合一个二维数组(一个 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。我知道这一定与输入和输出形状不匹配有关...

但是,用返回二维数组的一维数组输入拟合函数的正确方法是什么?

我的代码和值如下

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)

【问题讨论】:

  • y 是需要约束的值,使用curve_fit 将编辑添加示例

标签: python arrays numpy scipy


【解决方案1】:

Curve fit 并不是真正适用于此类问题,但幸运的是,您发现它只是在底层调用 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])

【讨论】:

  • 不错!正如你发布的那样,我只是在解开我的least_squares - darn :)
  • 有趣。 result 有一个奇怪的格式。将详细查看,看看它是否适合数据
  • 在函数和数据中使用ravel() 似乎也可以与curve_fit 函数一起使用!接受你的答案 - 也会发布我的:)
【解决方案2】:

根据@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-09-14
    • 2017-08-01
    相关资源
    最近更新 更多