gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:24:35 30 4
gpt4 key购买 nike

我一直在阅读有关将圆拟合到数据的一些方法(如 this )。我想看看这些方法如何处理真实数据并考虑使用 R 来实现这一点。我尝试在 rseek 中搜索可以帮助解决此问题的软件包,但没有找到任何有用的信息。

那么,是否有软件包可以帮助轻松计算给定数据集的最佳拟合圆(类似于 lm() 如何将线性模型拟合到数据集)?否则,如何在 R 中执行这样的任务?

最佳答案

这是一个相当简单的函数实现,它最小化了该论文中的 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)
fit$par值是 xcenter、ycenter、radius 的向量。
> plot(xy,asp=1,xlim=c(-2,2),ylim=c(-2,2))
> lines(circlexy(f$par))

points and fitted circle

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

绘制和生成圆的代码如下:
circlexy <- function(xyr, n=180){
theta = seq(0,2*pi,len=n)
cbind(xyr[1] + xyr[3]*cos(theta),
xyr[2] + xyr[3]*sin(theta)
)
}
sim_circles <- function(n,x=0,y=0,r=1,sd=0.05){
theta = runif(n, 0, 2*pi)
r = r + rnorm(n, mean=0, sd=sd)
cbind(x + r*cos(theta),
y + r*sin(theta)
)
}

关于r - 如何使用 R 找到最适合的圆/椭圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169122/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com