R:将 contour/complex 形状拟合到模型(多个 Y,单个 X)

R: fitting of a contour/complex shape to a model (multiple Y, single X)

我正在使用一个模型来将复杂的叶子形状模式拟合到数据中。数据只是来自(半)叶扫描的轮廓坐标,它可以看起来从正常功能到复杂形状的任何东西,具有相同 X 的多个 Y 坐标(例如,想想枫叶的一侧)。

然而,该模型不提供功能,而是根据一组特定规则生成的坐标序列。这些坐标不是数据的成对近似值(即从模型计算的点与数据的间隔不同,见下图) 练习的重点是找到一个函数来最小化(就像您将残差平方和用于简单形状一样),以便可以优化我的模型的参数以尽可能准确地描述形状。

示例1:一个简单的形状,一个Y代表一个X。如下图所示:

黑点是数据点,而红点是模型生成的最佳拟合点。如您所见,这 2 个数据集的间隔不相等,因此我使用插值方法计算模型在一组控制点上的 RSS(例如,为沿轴的多个点插值两个数据集)。这为我提供了最佳配合,所以这里没有问题。

示例 2:复杂形状,多个 y,单个 x。模型生成的形状的可能性如下:

假设我有一个数据集描述了这个模型生成近似的形状。我怎样才能确定模型适合我的轮廓的程度?

以防有人遇到类似问题。我最终通过区域重叠优化解决了这个问题。使用 r 包 sp 和 rgeos。

library(sp)
library(rgeos)
PolysData <- Polygons(list(Polygon(contourData), "Poly")
SpPData <- SpatialPolygons(list(PolysData), 1:1)
ParamOpt <- function(par){
    RSS <- tryCatch({
      contourGen <- GenerateShape(par)
      PolyFit <-  Polygon(contourGen)
      PolysFit <- Polygons(list(PolyFit), "Poly")
      SpPFit <- SpatialPolygons(list(PolysFit), 1:1)
      RSS <- tryCatch({
        Inters <- gIntersection(SpPData,SpPFit)
        TruePos <- Inters@polygons[[1]]@area
        FalsePos <- SpPFit@polygons[[1]]@area-TruePos
        FalseNeg <- SpPData@polygons[[1]]@area-TruePos
        TrueNeg <- 1-TruePos-FalsePos-FalseNeg
        Acc <- (TruePos+TrueNeg)/(TruePos+TrueNeg+FalsePos+FalseNeg)
        return(1 - Acc)
      }, error = function(err) {
        RSS <- 10
        return(RSS)
      })
      return(RSS)
    }, error = function(err) {
      RSS <- 10
      return(RSS)
    })
    return(RSS)
}

GenerateShape 函数是一个自写函数,它根据参数创建问题中呈现的形状。该标准基于 "Image processing techniques and segmentation evaluation"(Smochina,2011)

的评估标准