首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何拟合闭合轮廓?

如何拟合闭合轮廓?
EN

Stack Overflow用户
提问于 2012-11-28 20:01:45
回答 2查看 2.9K关注 0票数 1

我有一个表示闭合轮廓(带有噪声)的数据:

代码语言:javascript
复制
contour = [(x1, y1), (x2, y2), ...]

有没有什么简单的方法来拟合轮廓?这就是numpy.polyfit。但是,如果x值重复,并且需要一些努力来确定多项式的适当次数,那么它就失败了。

EN

Stack Overflow用户

发布于 2012-11-28 20:41:44

如果你确定了你的多项式次数,你可以简单地使用scipy.optimize中的至少函数

假设你生成了一个简单的圆。我会把它分成x和y两个部分。

代码语言:javascript
复制
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的差值。我们将曲线拟合为以原点为中心的圆。

代码语言:javascript
复制
def f(coef):
    a = coef
    return a*x**2+a*y**2-1

我们可以简单地使用leastsq函数来找到最佳系数。

代码语言:javascript
复制
from scipy.optimize import leastsq
initial_guess = [0.1,0.1]
coef = leastsq(f,initial_guess)[0]
# coef = array([ 0.92811554])

我只接受返回元组的第一个元素,因为至少返回了许多我们不需要的其他信息。

代码语言:javascript
复制
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])

编辑:

如果出于某种原因,您需要估计拟合参数的不确定性,您可以从结果的协方差矩阵中获得此信息:

代码语言:javascript
复制
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)形式的显式函数,而不是每个隐式多项式都可以转换成这种形式(或者更好的是,几乎没有任何有趣的隐式多项式)。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13604611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档