Scipy ValueError: object too deep for desired array with optimize.leastsq
Scipy ValueError: object too deep for desired array with optimize.leastsq
我正在尝试用线性 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 但它没有帮助。我不知道问题出在哪里,如果搜索 space 参数也不太复杂。如果能提供一些提示,我将不胜感激!
如果要为函数拟合参数,可以使用 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)
请注意,您的语法必须是 f(X, a, b, c) 形式,其中 X 可以是二维向量(参见 )。
(另一种方法)
如果您知道您的拟合是线性的,您可以使用 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]
我正在尝试用线性 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 但它没有帮助。我不知道问题出在哪里,如果搜索 space 参数也不太复杂。如果能提供一些提示,我将不胜感激!
如果要为函数拟合参数,可以使用 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)
请注意,您的语法必须是 f(X, a, b, c) 形式,其中 X 可以是二维向量(参见
(另一种方法)
如果您知道您的拟合是线性的,您可以使用 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]