我有一个表示闭合轮廓(带有噪声)的数据:
contour = [(x1, y1), (x2, y2), ...]有没有什么简单的方法来拟合轮廓?这就是numpy.polyfit。但是,如果x值重复,并且需要一些努力来确定多项式的适当次数,那么它就失败了。
发布于 2012-11-28 20:41:44
如果你确定了你的多项式次数,你可以简单地使用scipy.optimize中的至少函数
假设你生成了一个简单的圆。我会把它分成x和y两个部分。
data = [ [cos(t)+0.1*randn(),sin(t)+0.1*randn()] for t in rand(100)*2*np.pi ]
contour = array(data)
x,y = contour.T在给定多项式系数的情况下,编写一个简单的函数来计算每个点与0的差值。我们将曲线拟合为以原点为中心的圆。
def f(coef):
a = coef
return a*x**2+a*y**2-1我们可以简单地使用leastsq函数来找到最佳系数。
from scipy.optimize import leastsq
initial_guess = [0.1,0.1]
coef = leastsq(f,initial_guess)[0]
# coef = array([ 0.92811554])我只接受返回元组的第一个元素,因为至少返回了许多我们不需要的其他信息。
def f(coef):
a,b,cx,cy = coef
return a*(x-cx)**2+b*(y-cy)**2-1
initial_guess = [0.1,0.1,0.0,0.0]
coef = leastsq(f,initial_guess)[0]
# coef = array([ 0.92624664, 0.93672577, 0.00531 , 0.01269507])编辑:
如果出于某种原因,您需要估计拟合参数的不确定性,您可以从结果的协方差矩阵中获得此信息:
res = leastsq(f,initial_guess,full_output=True)
coef = res[0]
cov = res[1]
#cov = array([[ 0.02537329, -0.00970796, -0.00065069, 0.00045027],
# [-0.00970796, 0.03157025, 0.0006394 , 0.00207787],
# [-0.00065069, 0.0006394 , 0.00535228, -0.00053483],
# [ 0.00045027, 0.00207787, -0.00053483, 0.00618327]])
uncert = sqrt(diag(cov))
# uncert = array([ 0.15928997, 0.17768018, 0.07315927, 0.07863377])协方差矩阵的对角线是每个参数的方差,所以不确定性是它的平方根
有关拟合过程的更多信息,请访问http://www.scipy.org/Cookbook/FittingData。
我之所以使用leastsq而不是curve_fit函数,是因为curve_fit需要一个y = f(x)形式的显式函数,而不是每个隐式多项式都可以转换成这种形式(或者更好的是,几乎没有任何有趣的隐式多项式)。
https://stackoverflow.com/questions/13604611
复制相似问题