📜  平滑样条

📅  最后修改于: 2022-05-13 01:58:08.428000             🧑  作者: Mango

平滑样条

样条曲线是一种数学表示,很容易构建一个界面,允许用户设计和控制复杂曲线和曲面的形状。一般的做法是,用户输入一个点序列,然后构造一条曲线,其形状紧跟这个序列。这些点称为控制点。

三次样条:

三次样条是使用满足给定m 个控制点的三次多项式的样条。为了推导出三次样条的解,我们假设端点处的第二个推导为 0,这反过来提供了一个边界条件,将两个方程添加到m-2方程以使其可解。一维三次样条的方程组可由下式给出:

Y_i (t) = a_i + b_i *t + c_i * t^{2} + d_i t^{3}



插值样条:

在插值样条中,我们需要找到插值(x i , y i )使得g(x i ) = y i的曲线

平滑样条:

在平滑样条中,我们将尝试将样条拟合到数据集,以便我们可以通过为基函数选择一个高度多项式来最小化残差。我们将为拟合曲线的粗糙度添加一个惩罚项。这意味着随着粗糙度的增加,惩罚项也会增加,从而增加损失。

RSS 错误可以通过以下方式给出:

S(f) = \sum_{i=1}^{n}(y_i - f(x_i))^2 + \lambda \int f^{''}(x^{2})dx

这里,λ 是平滑参数,指导权衡拟合数据和函数的粗糙度。估计\lambda      我们执行广义交叉验证或受限边际似然。

  • \lambda \to 0:       没有平滑,样条收敛到插值样条。
  • \lambda \to \infty:      估计收敛到线性最小二乘法。

因此, λ导致平滑的曲线(极限中的直线)较小的λ导致更粗糙的曲线。最小化上述损失的上述样条的解决方案是在每个测量的x i处带有节点的自然三次样条。



\hat{f} = arg \,min\, S(f)

由于x i可能具有非常大的值,因此在实践中选择许多节点就足够了。

解的存在唯一性:

我们首先需要得到\hat{f}(x_i); i= 1,...,n 并从中导出 \hat{f}(x)

\hat{m}   是表示 ( \hat{m} = \hat{f}(x_0), \hat{f}(x_1), .... \hat{f}(x_n))^{T}   ) 那么,我们假设样条的平方和部分是固定的。现在,我们只需要最小化\int \hat{f}^{''}(x)^{2} dx   最小化器是内插点(x i , f^(x i )) 的自然三次样条。插值样条可以写成以下形式:

\hat{f}(x) = (Y- \hat{m})^{T} (Y-\hat{m})
粗糙度惩罚由下式给出:

\int \hat{f}^{''} (x)^{2} dx = \hat{m}^{T} K \hat{m}



因此,RSS 误差项可以由下式给出:

S(f) = (Y-\hat{m})^{T}(Y-\hat{m}) + \lambda \hat{m}^{T} K \hat{m}

= \hat{m}^{T} (I + \lambda K )\hat{m} - 2 Y^{T} \hat{m} + Y^{T} Y

最小值可以通过设置 \hat{m} = (I + \lambda K)^{-1} Y 来实现,其中, K是由下式给出的nxn矩阵

K= \Delta^{T} W^{-1}\Delta



其中, \Delta : (n-2) xn矩阵的二阶差分和 W 是(n-2) x (n-2)矩阵

选择平滑参数:

  • 有两种执行平滑参数的方法:
  • Cross Validation Method:在数学上,用于调整参数的交叉验证方法\lambda   是 :

\underset{\lambda}{min} CV (\lambda) = \frac{1}{n} \sum_{i=1}^{n} \left (\frac{y_i - \hat{f}_\lambda (x_i)}{1- (m_\lambda)_{ii} }    \right )^{2}

其中,(m_\lambda)_{ii} 表示第 i 个对角元素\hat{m}   .

  • 广义交叉验证:在广义交叉验证中,将交叉验证中的分母 1 – (m_\lambda)_{ii} 替换为它们的平均值之和,即跟踪平均值:

\underset{\lambda}{min} GCV (\lambda) = \frac{1}{n}  \frac{ \sum_{i=1}^{n}(y_i - \hat{f}_\lambda (x_i))^{2}}{(1 - \frac{1}{n} trace(m_{\lambda}))^{2}}

执行:

  • 在这个实现中,我们将使用 R 实现平滑样条。我们将使用 MultiKink 库提供的三头肌数据。要安装这个库,我们可以使用 R 中的install.packages(“”)函数。
R
# Code
library(MultiKink) #for triceps data
library(ggplot2)   #for the plots
set.seed(2021)   
  
# load trips data
data("triceps")
# smooth spline
spline0 = smooth.spline(triceps$age,triceps$triceps)
# smooth spline with lambda parameter
spline1 <- smooth.spline(triceps$age,triceps$triceps, lambda=.000000001) 
# smooth spline with degree of freedom (equivalent to trace in GCV)
spline2 = smooth.spline(triceps$age, triceps$triceps, df =100)
# smooth spline with cross-validation
spline3= smooth.spline(triceps$age, triceps$triceps, cv =10)
  
# plot the above dataset with spline lines
plot(triceps$age, triceps$triceps)
  
# plot different splines
lines(spline0, col='yellow')
lines(spline1, col="blue")
lines(spline2, col="red")
lines(spline3, col="green")


输出:


显示不同样条曲线的图

参考:

  • 平滑样条滑动