我有一个数据集,其中包含一组点。这些点在平面上分布,可以大致被一个抛物线界定。我正在寻找一种方法来拟合这些点的边界所形成的抛物线。
目前我拥有以下内容:
a = 1
b = 2
c = 3
parabola <- function(x) {
a * x^2 + b * x + c
}
N = 10000
x <- runif(N, -4, 3)
y <- runif(N, 0, 10)
data <- data.frame(x, y)
data <- subset(data, y >= parabola(x))
plot(data, xlim = c(-5, 5), ylim = c(0, 10), col = "grey")
fr <- function(x) {
PAR = x[1] * data$x^2 + x[2] * data$x + x[3]
#
sum((PAR - data$y)^2 + 100 * plogis(PAR - data$y, scale = 0.00001))
}
par = optim(c(0, 0, 0), fr)$par
a = par[1]
b = par[2]
c = par[3]
curve(parabola, add = TRUE, lty = "dashed")
这将创建一个示例数据集,并将曲线拟合到边界。目标函数由一个“正常”的平方误差项组成,它将数据拟合成一个抛物线,以及第二个逻辑术语,该术语惩罚生活在抛物线下方的点。这个第二个术语的参数(100和0.00001)是通过试错确定的。
代码绘制了点以及拟合的抛物线。
现在这个系统可以工作……但只有在某些时候。有时它会产生完全错误的拟合,我猜在这些情况下,逻辑术语的参数只是不合适。运行几次代码以查看我的意思。
我相信一定有更稳健的方法来解决这个问题。有什么想法和建议吗?
.
optim
中的默认算法不是很好。尝试指定method="BFGS"
或method="L-BFGS-B"
. - Hong Ooiset.seed(999)
并运行您的代码,那是否是一个错误拟合的例子?给我们一些可处理的东西!在这种情况下,method="BFGS"
会产生更好的拟合效果... - Spacedman