【问题标题】:Scipy ValueError: object too deep for desired array with optimize.leastsqScipy ValueError:对象太深,无法使用 optimize.leastsq 进行所需的数组
【发布时间】:2019-04-15 06:50:22
【问题描述】:

我正在尝试使用线性 3D 函数 Z = ax+by+c 拟合我的 3D 数据。我用 pandas 导入数据:

dataframe = pd.read_csv('3d_data.csv',names=['x','y','z'],header=0)

print(dataframe)

            x          y          z
0   52.830740   7.812507   0.000000
1   44.647931  61.031381   8.827942
2   38.725318   0.707952  52.857968
3    0.000000  31.026271  17.743218
4   57.137854  51.291656  61.546131
5   46.341341   3.394429  26.462564
6    3.440893  46.333864  70.440650

我做了一些挖掘,发现拟合 3D 数据的最佳方法是使用 scipy 的优化与模型方程和残差函数:

def model_calc(parameter, x, y):
    a, b, c = parameter
    return a*x + b*y + c

def residual(parameter, data, x, y):
    res = []
    for _x in x:
        for _y in y:
            res.append(data-model_calc(parameter,x,y))
    return res

我将数据拟合为:

params0 = [0.1, -0.2,1.]
result = scipy.optimize.leastsq(residual,params0,(dataframe['z'],dataframe['x'],dataframe['y']))
fittedParams = result[0]

但结果是ValueError:

ValueError: object too deep for desired array [...]
minpack.error: Result from function call is not a proper array of floats.

我试图最小化残差函数以仅给出单个值或单个 np.array 但它没有帮助。我不知道问题出在哪里,也许参数的搜索空间不是太复杂。我将非常感谢一些提示!

【问题讨论】:

    标签: python numpy scipy data-fitting function-fitting


    【解决方案1】:

    如果你正在为函数拟合参数,你可以使用curve_fit。这是一个实现:

    from scipy.optimize import curve_fit
    
    def model_calc(X, a, b, c):
        x, y = X
        return a*x + b*y + c
    
    p0 = [0.1, -0.2, 1.]
    popt, pcov = curve_fit(model_calc, (dataframe.x, dataframe.y), dataframe.z, p0)  #popt is the fit, pcov is the covariance matrix (see the docs)
    

    请注意,您的 sintax 必须是 f(X, a, b, c) 的形式,其中 X 可以是二维向量(参见 this post)。

    (另一种方法)

    如果您知道您的拟合将是线性的,您可以使用numpy.linalg.lstsq。见here。示例解决方案:

    import numpy as np
    from numpy.linalg import lstsq
    A = np.vstack((dataframe.x, dataframe.y, np.ones_like(dataframe.y))).T
    B = dataframe.z
    a, b, c = lstsq(A, B)[0]
    

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 2017-01-21
      • 2012-10-28
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多