如何使用R找到最合适的圆/椭圆?

时间:2014-11-27 11:05:29

标签: r best-fit-curve

我一直在阅读一些方法,以便将圆圈拟合到数据中(例如this)。我想看看这些方法如何处理真实数据以及为此使用R的想法。我试着在rseek上搜索可以帮助解决这个问题的软件包,但是没有任何用处。

那么,是否有包可以帮助您轻松计算给定数据集的最佳拟合圆(类似于lm()如何使线性模型适合数据集)?否则,如何在R?

中执行这样的任务

2 个答案:

答案 0 :(得分:6)

这是一个相当天真的函数实现,可以最大限度地减少SS(a,b,r)中的文章:

fitSS <- function(xy,
                  a0=mean(xy[,1]),
                  b0=mean(xy[,2]),
                  r0 = mean(sqrt((xy[,1]-a0)^2 + (xy[,2]-b0)^2)),
                  ...){
    SS <- function(abr){
        sum((abr[3] - sqrt((xy[,1]-abr[1])^2 + (xy[,2]-abr[2])^2))^2)
    }
    optim(c(a0,b0,r0), SS, ...)
}

我已经编写了几个支持函数来生成圆圈上的随机数据并绘制圆圈。因此:

> xy = sim_circles(10)
> f = fitSS(xy)
> plot(xy,asp=1,xlim=c(-2,2),ylim=c(-2,2))
> lines(circlexy(f$par))

points and fitted circle

请注意,它不使用渐变,也不检查错误代码是否收敛。您可以为其提供初始值,也可以猜测。

答案 1 :(得分:2)

好吧,请看这里:R-blogger column编写了一些适合椭圆和圆圈的代码。他的代码,我不会在此重新发布,是基于RadimHalíř和Jan Flusser在Matlab中完成的先前工作。他的代码包括(评论)原始的Matlab行进行比较。

我已经看过很多关于这个主题的论文,并且只能说我没有资格确定哪些算法最强大。对于那些感兴趣的人,请看看这些论文:

http://www.emis.de/journals/BBMS/Bulletin/sup962/gander.pdf

http://ralph.cs.cf.ac.uk/papers/Geometry/fit.pdf

http://autotrace.sourceforge.net/WSCG98.pdf

后续编辑:我使用Spacedman的代码对照链接的R代码来拟合椭圆,使用相同的“嘈杂”的1e5点作为输入。结果是:

testcircle<-create.test.ellipse(Rx=200,Ry=200,Rot=.56,Noise=5.5,leng=100000)
 dim(testcircle)
[1] 100000      2

microbenchmark(fitSS(testcircle),fit.ellipse(testcircle))
Unit: milliseconds
                    expr       min        lq    median        uq       max
       fitSS(testcircle) 649.98245 704.05751 731.61282 787.84212 2053.7096
 fit.ellipse(testcircle)  25.74518  33.87718  38.87143  95.23499  256.2475
 neval
   100
   100

作为参考,两个拟合函数的输出为:

来自SSfit,列表

ssfit
$par
[1] 249.9530 149.9927 200.0512

$value
[1] 185.8195

$counts
function gradient 
     134       NA 

$convergence
[1] 0

$message
NULL

fit.ellipse,我们得到

ellfit
$coef
            a             b             c             d             e 
-7.121109e-01 -1.095501e-02 -7.019815e-01  3.563866e+02  2.136497e+02 
            f 
-3.195427e+04 

$center
       x        y 
249.0769 150.2326 

$major
[1] 201.7601

$minor
[1] 199.6424

$angle
[1] 0.412268

对于“偏离”圆的项,可以看出椭圆方程的系数接近于零;绘制两个结果可以产生几乎无法区分的曲线。