引言
&esmp;这一系列文章主要是为了解决KAN论文中对于Bspline介绍语焉不详的问题,为没有图形学、动态路径规划等领域基础知识的人提供一些BSpline的相关只知识。网络上现有的关于Bspline的介绍往往是从图形学角度出发,会略过许多的简单概念辨析,默认读者有相关图形学的基础,且以曲线生成为导向。而本文则尽量从新手的角度出发,解释KAN源码中所用到的Bspline,因此尽量简单明确,一切条件使用最基础、最理想的情况。
BSpline曲线生成原理
首先我们需要区分BSpline曲线、BSpline插值、BSpline拟合三者之间的差异:
BSpline曲线1
给定一系列的控制点
p
0
,
.
.
.
,
p
n
p_0,...,p_n
p0,...,pn(control points)以及节点向量
U
=
{
u
0
,
.
.
,
u
m
+
1
}
U=\{u_0,..,u_{m+1}\}
U={u0,..,um+1}(knot vector),我们需要生成一条曲线,满足关系:
C
(
u
)
=
∑
i
=
0
n
p
i
N
i
,
k
(
u
)
C(u)=\sum_{i=0}^{n} p_iN_{i,k}(u)
C(u)=i=0∑npiNi,k(u)
拟合出的曲线在节点处的取值
C
(
u
j
)
C(u_j)
C(uj)称作为节点点(knot point)。生成的曲线就是
有两点需要着重注意:
- 拟合出的曲线并不一定、或者说大部分情况下不通过控制点,即 C ( u j ) ≠ u j C(u_j)\neq u_j C(uj)=uj,因为Bspline曲线构造的目的本来就只是生成由控制点决定的曲线,而非穿过他们;
- 这里控制点并只局限于标量,而是向量点 P 0 , . . . , P n + 1 \bold{P_0},...,\bold{P_{n+1}} P0,...,Pn+1,并且是认为给定的。
BSpline插值2
BSpline插值的含义是给定一系列数据点 D 0 , . . . , D n D_0,...,D_n D0,...,Dn,给定预期的次数 k k k,我们要找到一条BSpline曲线穿过这些点。这里有以下几点需要注意:
- 这里给出的是数据点而非控制点,由前一定义可知,我们定义BSpline曲线要给出控制点,并且BSpline曲线只穿过节点点而非控制点。因此我们需要依据节点点(这里就是数据点)来反推控制点。
- 这里我们需要自行来给出节点向量。
BSpline拟合3
Bspline拟合的定义和Bspline插值类似,同样给出一系列数据点 D 0 , . . . , D n D_0,...,D_n D0,...,Dn,希望找到一条 B-spline 曲线,使其沿着数据多边形的形状进行,但实际上不包含数据点。为了做到这一点,我们需要两个额外的输入:控制点的数量(即 h + 1 h+1 h+1)和次数 k k k,其中必须满足 n > h > = k > = 1 n > h >= k >= 1 n>h>=k>=1。因此,逼近比插值更加灵活,因为我们不仅选择了一个次数,还选择了控制点的数量。
总结来看,Bspline插值和Bspline拟合都是基于Bspline曲线来进行的,三者并不是各自的同位体,而是不同的场景下使用的三种不同方法。而在KAN中我们则使用到了Bspline插值和Bspline拟合。后续文章会对这一部分进行详细解释。