Scipy最小二维需要2个方格//错误:函数调用的结果不是正确的浮点数组

时间:2018-02-07 20:01:46

标签: python numpy scipy least-squares minimize

当前我正在尝试使用scipy的最小二乘法或其任何最小化函数来最小化具有5个参数的函数。

我希望scipy做的是使用标准最小二乘法最小化某些功能。

我的代码如下:

 fitfunc1 = lambda p, xx, yy, zz: -(50000*(xx + (p[0] + p[1])*yy +  
 p[3]))/(1.67*(-p[2]*yy + zz + p[4]))

 errfunc1 = lambda p,x11, xx, yy, zz: fitfunc1(p, xx, yy, zz) - x11
 x0 = np.array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1], dtype = float)

res3 = leastsq(errfunc1, x0[:], args=(x1, x, y, z))

其中x1,x,y,z是相同长度的所有列numpy数组约90x1

我目前收到的错误是“错误:函数调用的结果不是一个正确的浮点数组”,我尝试了很多可能性,并尝试按照示例中描述的方式重写它,但是没有似乎工作。

另外:我其实想解决这个问题:

最小和(f - x1)** 2 +(g - x2)** 2 其中f = f(p,x,y,z)和g = g(p,x,y,z)和x,y,z,x1,y1都是数据,但是试图找到参数,p(6他们)。

这目前在最小方块中是否可行?我曾尝试使用scipy.minimize,但是当使用Nedler的Mead方法完成时,它似乎也不起作用。

这是我目前的代码:

def f(phi, psi, theta, xnot, ynot, znot):
  return sum(abs(   (-50000*(x[:]+ (psi + phi)*y[:] + xnot)/(1.67*(-
   theta*y[:] + z[:] + znot))) - x1[:]) //
  + abs(   (-50000*(-x[:]*(psi + phi) + y[:] + theta*(z[:]) + ynot)/(1.67*(-
  theta*y[:] + z[:] + znot))) - y1[:]))

  x0 = np.array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1], dtype = float)
  res3 = leastsq(f, x0[:], args=(x1, y1, x, y, z))

我觉得好像我犯了一些错误,对于一个比较熟悉的人来说这可能是显而易见的,但这是我第一次使用scipy。非常感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

我相信你的问题在于变量的形状:

  

其中x1,x,y,z是相同长度的所有列numpy数组约90x1

它会导致fitfunc1errfunc1函数返回2d数组(形状(90,1)),其中scipy优化函数需要1d数组。 尝试重塑阵列,例如

x1 = x1.reshape((90,))

和其他输入变量类似。 这应该可以解决你的问题。