見出し画像

スプライン曲線~点を補間する曲線の引き方~

スプライン曲線とは

スプライン曲線を聞いたことがあるだろうか?
2次元空間$${(x, y)}$$に対して、n個のデータ点$${(x_i, y_i)_{1\leq i \leq n}}$$を考えた時にこのデータ点を全て通る関数fはどう作れば良いかという問題がある。これに答えるのがスプライン関数(曲線)の理論である。
例えばPythonにおいてはscipyライブラリとしてモジュール化されており、誰でも簡単に使えるようになっており、何らかの可視化システムを作る際にデータ点外の予測を与えることもできる。即ちそれは1つの非線形回帰を示している。
本記事でやりたいのはスプライン関数の概要紹介であるが、重要なことはスプライン関数があるモデルに対する非線形回帰として数学的最適性を持っているということである。

Lagrangeの公式

多項式で異なる$${n}$$個のデータ点$${(x_i, y_i)}$$を補間することを考えてみると、明らかに$${n-1}$$次多項式がその補間に対する必要十分だと推測出来るだろう。この補間多項式をLagrangeと呼ぶ。
即ち
$${P(x)=(x-x_1)(x-x_2)\cdots(x-x_n)}$$
$${P_i(x)=(x-x_1)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_n)}$$
とした時
$${L(x)=\sum_i \frac{P_i(x)}{P_i(x_i)y_i}}$$
がこの要請を満たす多項式である。ただし$${P_i}$$は$${n-1}$$次多項式。

連続微分可能性

$${k-1}$$を連続微分可能性のオーダーとすると、Lagrange多項式は$${n=k}$$なるクラスの関数群について何らかの意味で補間関数として必要十分の構成に見える。
実際Lagrange多項式は$${\sigma = \int_{b}^{a}[f^{(k)}(x)]^2dx}$$最小化の元、一意に決定される補間関数である。(但し、データ点は$${a < x_1< \cdots < x_n < b}$$を満たすとする)。
ここでオーダー$${k}$$について$${k-1}$$に対する連続微分可能性の元、$${\sigma}$$を最小にする関数を最も滑らかと定義すると問題は$${k < n}$$の時であろう。こうすると、もはや単純な多項式は過大表現を与えるようになる。即ちここで登場するのがスプライン関数である。

スプライン関数の定義

各区間$${[x_{i-1},x_i]}$$上で多項式を作るのがスプライン関数である。ここで各joint点$${x_i}$$(※knotsと呼ぶことにする)に対しても、出来る限り滑らかさを求めたいのだが、m次スプラインがm階連続微分である多項式の成分を持つスプライン関数としてknotsに対しても最大であるm階連続微分可能性を求めるとナンセンスになる。何故ならばm階微分をしたものが定数関数になるとすると、その関数は定数関数のm重積分であり、それは多項式だからである。故に連続微分可能性を求めるべき最大値は$${m-1}$$階である。
即ちm次スプライン関数とは階段関数のm重積分であり、階段関数の不連続点こそknotsである。

自然スプライン

自然スプラインは両端区間$${(-\infty, x_1), (x_n, \infty)}$$で高々m-1次の多項式で与えられる2m-1次スプラインの事を言う。これが理論上最も重要なスプラインであるのはオーダー$${k < n}$$に関する補間問題に対して唯一解を与えるからである。
即ち、「定理1: 自然スプラインは全て下記の表現で表せられる。」
$${s(x) = p_{m-1}(x) + \sum c_i(x - x_i)_{+}^{2m-1}}$$
$${\sum c_i x_i^r = 0  (r=0, 1, \cdots , m-1)}$$
但し$${(x)_+}$$は負で0、正でxを表す切断べき関数。
「定理2: オーダー$${k < n}$$における補間問題の唯一解は上記表現の$${2k-1}$$次自然スプラインである。」

スプライン係数の導出上のヒント

上記表現における$${2k-1}$$次自然スプラインは$${n+k}$$個の未知係数を持ち、束縛条件は$${(x_i, y_i)}$$に関するn個と変数rに関するk個であるから、解ける事が期待できるし実際に解ける。しかし逆行列の演算は計算負荷が非常に高く実際的ではない。故に計算アルゴリズムとしての別式を用意すべき状況になっている。
故に実際にはN-スプラインのk次2重差分商というものを計算し、係数を導くことになり、この時の自然スプラインは
$${s(x) = p_{k-1} + \sum b_i N_i(x)}$$
となる。ここで$${p_{k-1}}$$と$${b_i}$$は既知だが、$${N_i(x)}$$は多項式としては既知ではなく、知りたい実データ点$${x_0}$$毎にN-スプラインのk階差分商を計算することにより導かれる。

平滑化自然スプライン

自然スプラインを平滑化して必ずしもデータ点を通らないスプラインもあり、これをスプライン曲線として作図したことがある人もいると思うが、これは$${\sigma = \sum w_i[f(x_i) - y_i]^2 + g\int[f^{(k)}]^2}$$の最小化という一般的な要請に答える関数$${f}$$である。この時条件$${s(x_j) = y_j}$$は、$${s(x_j) +(-1)^kg(2k-1)!c_jw_j^{-1}= y_j}$$に代わる。但し、$${c_j}$$は切断べきの係数。
自然スプラインと違い一般的にアルゴリズムとしての計算量は肥大化する。

まとめ

スプライン関数どうでしたか?歴史的には1960年代くらいから発展した理論みたいです。前提知識をそんなに用いるわけではないので、煩雑性になれればとっかかり安いのかなと思います。また応用に近い形で定理が存在するのも面白いと思います。下記の本をベースに紹介したので興味があれば調べてみてください。

スキください・・・;;
またね!!!

いいなと思ったら応援しよう!