Вот довольно наивная реализация функции, которая минимизирует 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, радиуса.
> plot(xy,asp=1,xlim=c(-2,2),ylim=c(-2,2))
> lines(circlexy(f$par))
![точки и окружность](https://i.stack.imgur.com/RLm99.png)
Обратите внимание, что он не использует градиенты и не проверяет сходимость кода ошибки. Вы можете предоставить ему начальные значения, или у него может быть предположение.
Код для построения и создания кругов выглядит следующим образом:
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)
)
}
person
Spacedman
schedule
27.11.2014