我正在尝试使用scipy.leastsq()作为查找一组数据的最佳拟合点的方法。由于不熟悉scipy库,我得到的结论是,leastsq函数同时对整个数据集进行数学运算,但同时我遇到了问题,因为它似乎将某些数据点作为标量。
我的目标是将结果作为一组两个值 - 也就是一个点(x,y)与一系列圆的最小距离,这些圆也以(x,形式)给予最小的函数Y,半径)。在leastsq函数的前半部分中的数学运算找到最接近猜测的每个圆上的点,然后获得从猜测到该点的距离。
调用leastsq函数(xi,yi,radii已经将值加载到数组中)
#Now that we have the center, we can do least squares
#generate point guess starting at avg of circles
ptGuess = np.array([avgX,avgY])
point, cov,info,mesg, ier = optimize.leastsq(calcResiduals, ptGuess, args = (xi,yi,radii))
calcResiduals():
def calcResiduals(ptGuess, xi, yi, radii):
#extract x and y from guess point
xg = ptGuess[0]
yg = ptGuess[1]
#slope of the line from (xi,yi) to guess (xg,yg)
m = (yg - yi) / (xg - xi)
#Go along the line for the distance of c to get coordinates
deltax = radii / math.sqrt(1+m**2)
if (xi > xg):
xii = xi + deltax
else:
xii = xi - deltax
yii = m*(xii-xi) + yi
#residuals is distance from (xii,yii) to (xg, yg)
return (xii-xg)**2 + (yii-yg)**2
我得到的错误似乎暗示了将数组转换为乘法的标量值的问题,但我不知道为什么那条线不能用于前一行。
错误:
File "listener.py", line 62, in calcAPLocation
point, cov,info,mesg, ier = optimize.leastsq(calcResiduals, ptGuess, args = (xi,yi,radii))
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 276, in leastsq
m = _check_func('leastsq', 'func', func, x0, args, n)[0]
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 13, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "listener.py", line 76, in calcResiduals
deltax = radii / math.sqrt(1+m**2)
TypeError: only length-1 arrays can be converted to Python scalars
答案 0 :(得分:2)
如果代码中的xi和yi是点数组,则m应该是长度相等的数组 到len(xi)。函数math.sqrt需要长度为1或scalars的数组才能工作。
上一行:
m = (yg - yi) / (xg - xi)
有效,因为你要分成相同长度的数组。
此行失败:
deltax = radii / math.sqrt(1+m**2)
因为m是一个包含许多条目的数组,而python数学库不知道如何处理它。您可以尝试将math.sqrt更改为numpy.sqrt以获取每个的平方根 进入米我想这就是你所追求的。将上面的行更改为
deltaX = radii/np.sqrt(1 + m**2)