当前我正在尝试使用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。非常感谢所有帮助。
答案 0 :(得分:0)
我相信你的问题在于变量的形状:
其中x1,x,y,z是相同长度的所有列numpy数组约90x1
它会导致fitfunc1
和errfunc1
函数返回2d数组(形状(90,1)),其中scipy优化函数需要1d数组。
尝试重塑阵列,例如
x1 = x1.reshape((90,))
,
和其他输入变量类似。 这应该可以解决你的问题。