平滑样条
样条曲线是一种数学表示,很容易构建一个界面,允许用户设计和控制复杂曲线和曲面的形状。一般的做法是,用户输入一个点序列,然后构造一条曲线,其形状紧跟这个序列。这些点称为控制点。
三次样条:
三次样条是使用满足给定m 个控制点的三次多项式的样条。为了推导出三次样条的解,我们假设端点处的第二个推导为 0,这反过来提供了一个边界条件,将两个方程添加到m-2方程以使其可解。一维三次样条的方程组可由下式给出:
插值样条:
在插值样条中,我们需要找到插值(x i , y i )使得g(x i ) = y i的曲线。
平滑样条:
在平滑样条中,我们将尝试将样条拟合到数据集,以便我们可以通过为基函数选择一个高度多项式来最小化残差。我们将为拟合曲线的粗糙度添加一个惩罚项。这意味着随着粗糙度的增加,惩罚项也会增加,从而增加损失。
RSS 错误可以通过以下方式给出:
这里,λ 是平滑参数,指导权衡拟合数据和函数的粗糙度。估计我们执行广义交叉验证或受限边际似然。
- 没有平滑,样条收敛到插值样条。
- 估计收敛到线性最小二乘法。
因此, λ导致平滑的曲线(极限中的直线) ,较小的λ导致更粗糙的曲线。最小化上述损失的上述样条的解决方案是在每个测量的x i处带有节点的自然三次样条。
由于x i可能具有非常大的值,因此在实践中选择许多节点就足够了。
解的存在唯一性:
我们首先需要得到\hat{f}(x_i); i= 1,...,n 并从中导出 \hat{f}(x)
让是表示 ( ) 那么,我们假设样条的平方和部分是固定的。现在,我们只需要最小化最小化器是内插点(x i , f^(x i )) 的自然三次样条。插值样条可以写成以下形式:
粗糙度惩罚由下式给出:
因此,RSS 误差项可以由下式给出:
最小值可以通过设置 \hat{m} = (I + \lambda K)^{-1} Y 来实现,其中, K是由下式给出的nxn矩阵
其中, \Delta : (n-2) xn矩阵的二阶差分和 W 是(n-2) x (n-2)矩阵
选择平滑参数:
- 有两种执行平滑参数的方法:
- Cross Validation Method:在数学上,用于调整参数的交叉验证方法是 :
其中,(m_\lambda)_{ii} 表示第 i 个对角元素 .
- 广义交叉验证:在广义交叉验证中,将交叉验证中的分母 1 – (m_\lambda)_{ii} 替换为它们的平均值之和,即跟踪平均值:
执行:
- 在这个实现中,我们将使用 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")
输出:
参考:
- 平滑样条滑动