R找到最近的凸曲线"below"一组点
R Find the nearest convex curve "below" a set of points
我有一组点,我想找到最接近"below"这组点的凸曲线。
如下例所示,每个 v,w 点都在 qe 曲线上方。
感谢您的帮助。
v<-c(-1,0,0,.5,1.2,1.7,-1,1.7);w<-c(3,0,2,4,3,3.4,1,2.89)
qe<-seq(min(v),max(v),length.out=10)**2
plot(v,w)
lines(seq(min(v),max(v),length.out=10),qe)
您正在寻找的是最伟大的小凸面。要找到它,我们可以使用 fdrtool
包中的 gcmlcm
函数。
首先,我们需要确保每个 x
只有一个唯一值。因此,我们将 w
替换为
w2 <- tapply(w, v, min)
为v
的每个值分配w
的最小值。 (在这种情况下,v = 0
处有两个值。)仅此而已,我们的结果是
result <- gcmlcm(x = as.numeric(names(w2)), y = w2, "gcm")
我们可以用它绘制
lines(result$x.knots, result$y.knots)
给予
而且它在更复杂的情况下也能完美运行:
我有一组点,我想找到最接近"below"这组点的凸曲线。 如下例所示,每个 v,w 点都在 qe 曲线上方。 感谢您的帮助。
v<-c(-1,0,0,.5,1.2,1.7,-1,1.7);w<-c(3,0,2,4,3,3.4,1,2.89)
qe<-seq(min(v),max(v),length.out=10)**2
plot(v,w)
lines(seq(min(v),max(v),length.out=10),qe)
您正在寻找的是最伟大的小凸面。要找到它,我们可以使用 fdrtool
包中的 gcmlcm
函数。
首先,我们需要确保每个 x
只有一个唯一值。因此,我们将 w
替换为
w2 <- tapply(w, v, min)
为v
的每个值分配w
的最小值。 (在这种情况下,v = 0
处有两个值。)仅此而已,我们的结果是
result <- gcmlcm(x = as.numeric(names(w2)), y = w2, "gcm")
我们可以用它绘制
lines(result$x.knots, result$y.knots)
给予
而且它在更复杂的情况下也能完美运行: