scipy.optimize.leastsq适合:minpack.error

时间:2015-03-12 03:18:20

标签: python scipy least-squares

我正在尝试运行如下所示的代码,它是一个简单的最小二乘拟合,我正在跳跃以获得反向变量系数。

import numpy as np
def model(vars, x): 
  model = vars[0]*x[0]+vars[1]*x[1]+vars[2]
  return model
def residuals(vars, x, data):
  err = data - vars[0]*x[0]+vars[1]*x[1]+vars[2]
  return err

from scipy.optimize import leastsq
vars = [0.0, 0.0, 0.0]
x = np.genfromtxt('C:\Arrayx.txt')
data = np.resize(np.genfromtxt('C:\Data.txt'),(5,1))
out = leastsq(residuals, vars, args=(x, data))

Arrayx.txt的内容为:

240 0
7   86
241 184
478 92
244 90

Data.txt的内容为:

1.765
1.901
2.17
2.09
2.01

运行代码时出现以下2条错误消息: minpack.error:函数调用的结果不是正确的浮点数组。 ValueError:对象太深,不适合所需的数组。 我是python的新手,对此问题的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

你的问题实际上并不是最少的问题:它与numpy数组维度的工作方式有关。

xdata都是二维数组,因为你加载它们的方式(至少对于x,它无论如何都需要为2d; data不会#39; T)。 Numpy索引是(行,列)。您认为我的x[0]x[1]意图访问x的第一个和第二个,实际访问第一个和第二个(第5个)< EM>行。当您将这些1x2数组添加到5x1数据数组时,Numpy会尝试提供帮助。结果是residuals的输出,即最小的qs无法处理(尝试自己运行残差)。

您可能想要做的是访问第一列和第二列,将这些列乘以正确的var元素,然后将(五个)数字添加到数据中的五个数字。要获取x列,您应该执行x[:,0](所有行,第0列)之类的操作。问题是,这会返回一维数组,并且您已使用np.resize明确地将data二维与一列和五行。你不需要 - 数据实际上只是一维的,所以我们可以删除调整大小。结果如下:

import numpy as np
def model(vars, x): 
  model = vars[0]*x[:,0]+vars[1]*x[:,1]+vars[2]
  return model
def residuals(vars, x, data):
  err = data - vars[0]*x[:,0]+vars[1]*x[:,1]+vars[2]
  return err

from scipy.optimize import leastsq
vars = np.array([0.0, 0.0, 0.0])
x = np.genfromtxt('Arrayx.txt')
data = np.genfromtxt('Data.txt')
out = leastsq(residuals, vars, args=(x, data))