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)
的评估标准
我正在使用一个模型来将复杂的叶子形状模式拟合到数据中。数据只是来自(半)叶扫描的轮廓坐标,它可以看起来从正常功能到复杂形状的任何东西,具有相同 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)
的评估标准