我有一个由一组点组成的数据集。这些点在平面上的分布方式使得它们可以大致以抛物线为界。我试图找到一种将抛物线拟合到点边界的方法。
这是我目前拥有的:
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)是通过反复试验确定的。
该代码绘制了点以及拟合的抛物线。
现在这个系统可以工作了……但只是在某些时候。有时它会产生完全错误的拟合,我猜在这些情况下,逻辑项的参数是不合适的。运行代码几次,看看我的意思。
我确信必须有一种更强大的方法来解决这个问题。想法和建议?
.