在bs-call中指定钳位结矢量

时间:2015-11-09 12:52:39

标签: r curve-fitting bspline

我打算将一个夹紧的b样条拟合到R中的一组控制点,但是无法理解bs中knots参数的使用。给定一组控制点:

path <- data.frame(
    x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
    y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
)

我根据路径上的距离独立地拟合x和y:

path$distance <- c(0, cumsum(sqrt(diff(path[,1])^2 + diff(path[,2])^2)))
path$distance
##  [1]  0.000000  1.118034  4.344511  9.382259 13.566026 27.766169 41.860284 48.799899 52.877545 56.535931 57.950145
## [12] 59.068179

但我想提供一个开放的统一结矢量,以便将拟合锚定到第一个和最后一个点 - 使用df不支持此功能。

根据我的理解,对于我给定的点集和样条曲线的3度,必须有(12-1)+3+2 = 16个结(每m = n + p + 1,对于#knots = m + 1) ,#control = n + 1,degree = p),所以对于一个夹紧的样条曲线,这应该是一个很好的结矢量:

knots <- seq(path$distance[1], path$distance[12], length.out = 10)
knots <- c(rep(knots[1], 3), knots, rep(knots[10], 3))
knots
##  [1]  0.000000  0.000000  0.000000  0.000000  6.563131 13.126262 19.689393 26.252524 32.815655
## [10] 39.378786 45.941917 52.505048 59.068179 59.068179 59.068179 59.068179

使用它会给出一些疯狂的数字,以及关于等级缺陷的警告,所以显然我必须以某种方式弄错:

pred_df  <-  data.frame(x=0,y=0,distance=seq(min(path$distance), max(path$distance), length.out=100))
xPath <- predict(lm(x~bs(distance, knots=knots, degree = 3), path), pred_df)
## Warning message:
## In predict.lm(lm(x ~ bs(distance, knots = knots, degree = degree),  :
##   prediction from a rank-deficient fit may be misleading
summary(xPath)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -2133.000     3.468    16.700  -161.900    64.590   857.800 

在给定一组控制点和度数的情况下指定结矢量的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

从你的'参数'和'结'数据判断,确实它们违反了勋伯格 - 惠特尼条件。我不熟悉R中的语法,但似乎你在path $ distance [1]和path $ distance [12]之间统一生成结值。这个不对。您应该按以下方式生成结点值:

0)将参数表示为p [i],其中i = 0到(n-1),p [0] = 0.0,n是点数。对于你的情况,n = 12
1)将结值创建为

knot [0] =(p [1] + p [2] + p [3])/ 3
   结[1] =(p [2] + p [3] + p [4])/ 3
   结[2] =(p [3] + p [4] + p [5])/ 3
   ......
   这些是内部结的价值。您应该注意到此步骤中不会使用p [0]和p [n-1]。您应该为您的箱子获得8个内部结点值 2)现在,将p [0]添加到结点值的前面4次(对于度数= 3)并将p [n-1]添加到结点值的末尾4次,然后就完成了。对于您的情况,您应该总共获得16个结值。

请注意,这不是唯一生成有效结矢量的方法。但以这种方式生成的结矢量将始终满足Shoenberg-Whitney条件。