我一直在阅读一些方法,以便将圆圈拟合到数据中(例如this)。我想看看这些方法如何处理真实数据以及为此使用R的想法。我试着在rseek上搜索可以帮助解决这个问题的软件包,但是没有任何用处。
那么,是否有包可以帮助您轻松计算给定数据集的最佳拟合圆(类似于lm()
如何使线性模型适合数据集)?否则,如何在R?
答案 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))
请注意,它不使用渐变,也不检查错误代码是否收敛。您可以为其提供初始值,也可以猜测。
答案 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
对于“偏离”圆的项,可以看出椭圆方程的系数接近于零;绘制两个结果可以产生几乎无法区分的曲线。