文章目录

  • 背景
  • Spline Basis Function
  • 代码
  • 参考
  • 福利

背景

最近在研究functional 回归,发现有一些smoothing信号处理方法,跟我以前的一些肤浅的想法居然有一些共性,看来不是想不到,而是不敢想,想得不够深入的问题。这种算法提出已经比较久了,其中比较流行的一种平滑处理算法是基于B-spline。样条插值,作为一种插值或者函数逼近,无论是做图形图像还是数值分析,老早就接触过了,所谓了Spline Basis Function,第一反应无非是将函数切割,分段拟合罢了,保证分割处的n次导数相同即可。深入进行发现,这个基函数概念使得问题描述变得更加抽象,和之前的理解不太一样,下面记述一下自己对它的理解。看了一些不错的资料,但感觉描述的过于详细,反而觉得耽误了那些只想了解基本原理的人。所以,本文只想交代最重要的部分,细节可以参考文末给出的连接。

Spline Basis Function

首先,对于目标曲线进行分段,如何确定最优的分割点,据目前的了解也是相当复杂。这里,作为测试,分割点是自己直接设定的,详情可以参照后面的代码。
假设m+1个分割点, u 0 ≤ u 1 ≤ u 2 ≤ . . . ≤ u m , u i u_0 \leq u_1 \leq u_2 \leq ... \leq u_m,u_i u0​≤u1​≤u2​≤...≤um​,ui​称为节点(knots)。这样,原来的曲线分为m段区间。
下面给出Cox-de Boor递归公式,也就是Spline Basis Function的生成公式
N i , 0 ( u ) = { 1 , u i ≤ u < u i + 1 0 , o t h e r w i s e N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) N_{i,0}(u) = \left\{\begin{matrix} 1,& u_i \leq u < u_{i+1} \\ 0, & otherwise \end{matrix}\right.\\ N_{i,p}(u) = \tfrac{u-u_i}{u_{i+p}-u_i} N_{i,p-1}(u) + \tfrac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u) Ni,0​(u)={1,0,​ui​≤u<ui+1​otherwise​Ni,p​(u)=ui+p​−ui​u−ui​​Ni,p−1​(u)+ui+p+1​−ui+1​ui+p+1​−u​Ni+1,p−1​(u)
我们定义 N i , p N_{i,p} Ni,p​为第 i i i个 p p p次 B − B- B−样条基函数,定义有一些拗口,它的递推公式也有点让人一头雾水,没关系,很快就清楚了。
关于它的生成方式,可以引用下图来表示。第一列是分段区间,第二列为0次基函数,依次类推。

我们可以发现两个重要特点

  1. 区间的数量决定了基函数的最大次数 。区间数量越多,基函数的最大次数越大,不用说,函数的逼近效果也越好,但也容易过拟合。
  2. 基函数次数越大,它的作用范围也越大。如下图部分, N 1 , 3 N_{1,3} N1,3​它在蓝色虚线部分的区间 [ u 1 , u 5 ) [u_1,u_5) [u1​,u5​)取值为非0,其他全部为0.

    总结一下,我们可以得到,对于 N i , p N_{i,p} Ni,p​而言,它的作用范围是 [ u i , u i + p + 1 ) [u_i,u_{i+p+1}) [ui​,ui+p+1​)。
    那么可以知道, N i , p − 1 N_{i,p-1} Ni,p−1​的作用范围 [ u i , u i + p ) [u_i,u_{i+p}) [ui​,ui+p​), N i + 1 , p − 1 N_{i+1,p-1} Ni+1,p−1​的作用范围 [ u i + 1 , u i + p + 1 ) [u_{i+1},u_{i+p+1}) [ui+1​,ui+p+1​),
    现 在 可 以 解 释 \color{red}{现在可以解释} 现在可以解释 N i , p \color{red}N_{i,p} Ni,p​ 的 递 推 公 式 \color{red}{的递推公式} 的递推公式
    N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) N_{i,p}(u) = \tfrac{u-u_i}{u_{i+p}-u_i} N_{i,p-1}(u) + \tfrac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u) Ni,p​(u)=ui+p​−ui​u−ui​​Ni,p−1​(u)+ui+p+1​−ui+1​ui+p+1​−u​Ni+1,p−1​(u)
    N i , p N_{i,p} Ni,p​实际上就是 N i , p − 1 N_{i,p-1} Ni,p−1​和 N i + 1 , p − 1 N_{i+1,p-1} Ni+1,p−1​的加权和,加权系数是怎么确定的呢,是根据u在两者对应的作用区间的位置决定的。我们可以看到,当 u u u在作用范围的边界时候,基函数的取值都接近于0.

下面看一段代码,来看看具体是怎么一回事情。代码将[0,4]均匀分成4个区间。然后,分别生成0,1,2,3次基函数,刚好4张图。

代码

代码比较简单,不过写得烂也没注释,跑一下就清楚了

clear;
linecolor = ['r','g','b','y','k','c','m','k','r','g','b'];
%knot span
knots = [0,1,2,3,4];
Len = 40;
x = linspace(0,4,Len);
figure('color','w');
for i = 1:1:4bf  = GenerateBasicFunctionCurves(i-1,x,knots);subplot(2,2,i);drawsubplot(i-1,bf,linecolor,knots);
endfunction v  = SplineBasisFunction(i,p,u,knots)u_i  = knots(i);    u_i1 = knots(i+1);if p==0if u>=u_i && u<u_i1v = 1;return;endv = 0;return;endu_ip1 = knots(i+p+1);u_ip = knots(i+p);v = (u-u_i)/(u_ip-u_i)*SplineBasisFunction(i,p-1,u,knots)+(u_ip1-u)/(u_ip1-u_i1)*SplineBasisFunction(i+1,p-1,u,knots);
end
function bf = GenerateBasicFunctionCurves(p,x,knots)for i = 1:1:length(knots)-1-pfor j = 1:1:length(x)bf(i,j) = SplineBasisFunction(i,p,x(j),knots);endend
end
function drawsubplot(p,bf,linecolor,knots)legendtxt = [];for i = 1:1:length(knots)-1-pplot(bf(i,:),strcat('-o',linecolor(i)),'LineWidth',1.5);hold on;txt = 'N';txt = strcat(txt,num2str(i-1));txt = strcat(txt,',');txt = strcat(txt,num2str(p));legendtxt  =  [legendtxt;string(txt)] ;endlegend(legendtxt);plotsettingtitle(p);
end
function plotsetting()a=gca;a.FontSize=20; set(gca,'fontweight','bold');set(gca,'Linewidth',2);xticks([1 ,11, 21,31,40]);xticklabels({'0','1','2','3','4' });
end


从上图可以看到,随着基函数的次数p增加,基函数的作用范围增大,基函数的数目减少。基函数的最大值一般靠近中间部位,两头趋近为0。上图有趣的地方在于,0次基函数就是一个门函数,1次基函数像是三角滤波器。
上图展现的是分割点均匀分布的情况,下图来一个不均匀分布的
修改上面代码的结点分割部分即可,其他不用调整
knots = [0,0.3,0.8,3.6,4];

参考

  1. CS3621 Introduction to Computing with Geometry Notes
  2. B-spline Curves 学习之B样条基函数的定义与性质(2)(中文版)

福利

为了查阅方便,把参考1部分打包成chm和pdf格式,有需要可以下载

Definition of Spline Basis Function相关推荐

  1. RBF(Radial Basis Function Network)+径向基网络

    RBF(Radial Basis Function Network)+径向基网络 在SVM中引入Gaussian Kernel就能在无限多维的特征转换中得到一条"粗壮"的分界线(或 ...

  2. 核函数与径向基函数 (Radial Basis Function 简称 RBF)详解

    1.核函数 1.1核函数的由来 -----------还记得为何要选用核函数么?----------- 对于这个问题,在Jasper's Java Jacal博客<SVM入门(七)为何需要核函数 ...

  3. 径向基(Radial basis function)神经网络、核函数的一些理解

    径向基函数(RBF)在神经网络领域扮演着重要的角色,如RBF神经网络具有唯一最佳逼近的特性,径向基作为核函数在SVM中能将输入样本映射到高维特征空间,解决一些原本线性不可分的问题. 本文主要讨论: 1 ...

  4. 径向基(Radial Basis Function:RBF)神经网络

    前言 径向基函数是一个取值仅仅依赖于离远点的实值函数,也就是ϕ(x)=ϕ(∣∣x∣∣)\ \phi(x)=\phi(||x||) ϕ(x)=ϕ(∣∣x∣∣),或者还可以是任意一点c的距离,c点称为中心 ...

  5. 径向基函数(RBF Radial Basis Function)神经网络

    径向基函数(RBF Radial Basis Function)神经网络是由J.Moody和C.Darken在20世纪80年代末提出的一种神经网络,它是具有单隐层的三层前馈网络.由于它模拟了人脑中局部 ...

  6. 径向基(Radial Basis Function:RBF)神经网络学习笔记

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 一. 从BP神经网络到RDF神经网络 在上一篇文章BP(Back ...

  7. matlab径向基函数插值,径向基函数(Radial Basis Function)插值

    将RBF用于插值 标签(空格分隔):径向基函数插值 算法 RBF 曲面重构 当高维数据稀疏,需要预测一些数据,需要使用曲面重构的方法. 曲面重构一般可以分为: 插值 重构 曲面插值里我们一般使用径向基 ...

  8. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制

    文章目录 1. 什么是径向基函数 1. 高斯径向基函数 2. 反演S型函数 3. 拟多二次函数 2. 正则化径向基神经网络 3. 基于RBF网络逼近的自适应控制 1. 问题描述 2. RBF 网络原理 ...

  9. Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记

    Reconstruction and Representation of 3D Objects with Radial Basis Functions 阅读笔记 紧接着上面的连篇blog,本篇学习如何 ...

最新文章

  1. 简单使用SpringCloud的fegin和熔断hystrix
  2. 解决“跨域问题”的几种方法
  3. 有哪些越早知道越好的人生经验?
  4. 软件工程里的UML序列图的概念和总结
  5. C#的目录与文件操作
  6. python模拟gps定位_python 模拟 GPS, $GPRMC $GPRMC
  7. l298n电机哪一端为正_L298N使用说明介绍
  8. 两个HC05蓝牙模块相互之间的通信
  9. dos攻击防范 php,DOS攻击和DDOS攻击的区别
  10. python加权求和_python求加权平均值的实例(附纯python写法)
  11. javascript函数传参
  12. 北航学堂Android客户端Beta阶段发布说明
  13. 硬件设计18之什么是VGA?
  14. 美丽的往生者-让自己慢下来(34)
  15. 用计算机弹发如雪,计算器弹音乐谱子
  16. SQL server 2008R2 入门
  17. 「迅捷」校园网多设备认证
  18. 来了!娱乐篇!一文带你了解那些适合日常使用的开源工具和应用(娱乐篇)
  19. 学UI设计有前途吗?内附课程资源
  20. 摆脱手机缚束,让运动更自由,vivo WATCH 2智能手表评测

热门文章

  1. 中国人保为山东三同新材料承保产品责任险,为消费者保驾护航
  2. 【python】python列表去重的5种常见方法实例
  3. chart.js 参数说明
  4. 正则表达式(手机号前带区号)
  5. Pandas学习-Day3
  6. (FJWC2020)DTOJ 4688. 迫害 DJ
  7. MATLAB下载html页面
  8. 安卓报错E/EGL_adreno: tid 3927: eglSurfaceAttrib(1334): error 0x3009 (EGL_BAD_MATCH)
  9. CVPR2021论文详解Rainbow Memory: Continual Learning with a Memory of Diverse Samples
  10. Animation动画效果