R Найти ближайшую выпуклую кривую «под» множеством точек - PullRequest
0 голосов
/ 10 января 2019

У меня есть набор точек, и я хотел бы найти выпуклую кривую, ближайшую «ниже» этого набора точек. Как и в примере ниже, где все точки 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)

1 Ответ

0 голосов
/ 10 января 2019

То, что вы ищете, известно как Величайший выпуклый минорант . Чтобы найти его, мы можем использовать функцию gcmlcm из пакета fdrtool.

Во-первых, нам нужно убедиться, что для каждого x есть только одно уникальное значение. Итак, мы заменим w на

w2 <- tapply(w, v, min)

присваивает наименьшее значение w для каждого значения v. (В этом случае было два значения в v = 0.) И все, наш результат

result <- gcmlcm(x = as.numeric(names(w2)), y = w2, "gcm")

который мы можем построить с помощью

lines(result$x.knots, result$y.knots)

1021 * дает *

enter image description here

И это работает безупречно и в более сложных случаях:

enter image description here

...