5.2 区分的多項式とスプライン

来週の気温を予測したい。過去のデータに曲線をフィットさせて、未来を推測する。 ところが、予測モデルが「来週はマイナス100度です」と言い出した...。

これは冗談ではありません。1本の多項式でデータをフィットしようとすると、端っこで暴走することがあるのです。

この章では、この問題を解決する「区分的多項式」と「スプライン」の考え方を見ていきます。 データを区間に分けて、それぞれに別の曲線を当てはめる。そして、つなぎ目をなめらかにする。 シンプルですが、驚くほど強力なアイデアです。

この章の流れ:

  • なぜ1本の多項式ではダメなのか?
  • 「区切って考える」という発想
  • つなぎ目をなめらかにする工夫
  • 端っこを安定させる「自然スプライン」

1本の多項式の限界

データに曲線をフィットさせる方法として、多項式を使うことができます。$X, X^2, X^3...$ を組み合わせて、データに合う曲線を作る方法です。

でも、ここで問題が起きます。

例えば、「年齢と収入の関係」を予測したいとします。 20代〜50代のデータはたくさんあるけど、10代や60代以上のデータは少ない。 データの中央部分に合わせて多項式の次数を上げていくと...

高次多項式がデータの端で暴れる様子
高次多項式の不安定性:端で曲線が暴走する

端っこで曲線が暴れ始めます。「65歳の予測収入:マイナス500万円」なんて結果が出てしまう。

これは「グローバルな多項式」の宿命です。1つの式で全体を表現しようとするから、一部を調整すると他の部分まで影響を受けてしまう。

$$f(X) = \beta_0 + \beta_1 X + \beta_2 X^2 + \cdots + \beta_d X^d$$

この式で、$d$(次数)を上げれば複雑なパターンに対応できます。 しかし、式全体が1つにつながっているため、一部を変えると全体に影響が及びます。

では、どうすればいいのでしょうか?

「区切って考える」という発想

ここで、シンプルだけど強力なアイデアがあります。

データの範囲を区切って、各区間で別々の曲線を当てはめる。

例えば、年齢データが20歳から60歳まであるとします。 30歳と50歳で区切って、3つの区間に分ける:

そして、各区間で独立に曲線をフィットさせる。

この区切り点のことを「ノット(knot)」と呼びます。結び目という意味ですね。

最もシンプルなのは、各区間で定数(水平な直線)を当てはめる方法。 これを「区分的定数関数」と呼びます。階段のような形になります。

区分的定数関数の概念
区分的定数関数:各区間で異なる高さの水平線

区分的定数関数を数式で書くと、「指示関数」$I(\cdot)$ を使います。 これは「条件が成り立てば1、そうでなければ0」を返す関数です。

例えば $I(X < 30)$ は:

2つのノット $\xi_1, \xi_2$ で分割した区分的定数関数の基底:

$$h_1(X) = I(X < \xi_1), \quad h_2(X) = I(\xi_1 \leq X < \xi_2), \quad h_3(X) = I(X \geq \xi_2)$$

区分的線形関数 - もう少し柔軟に

定数では少し単純すぎますね。各区間で傾きを持たせたい。

そこで、各区間に1次関数(直線)を当てはめます。これが「区分的線形関数」です。

3つの区間があれば、3本の独立な直線。合計で6つのパラメータ(切片3つ、傾き3つ)が必要になります。

でも、ここで気づくことがあります。

隣り合う区間の直線が、ノットでつながっていない。ガクッと段差ができてしまう。 これでは「年齢30歳になった瞬間に収入が急に100万円上がる」みたいな不自然な予測になってしまいます。

不連続な区分的線形関数と連続版の比較
左:不連続な直線(段差あり) vs 右:連続な折れ線(なめらかにつながる)

「つなぎ目でも連続にしたい」という制約を加えてみましょう。

連続性の制約を加えた区分的線形関数の基底:

$$h_1(X) = 1, \quad h_2(X) = X, \quad h_3(X) = (X - \xi_1)_+, \quad h_4(X) = (X - \xi_2)_+$$

ここで $(X - \xi)_+$ は「正の部分関数」。マイナスになったら0に切り捨てる関数です。

でも、この謎めいた記号 $(X - \xi)_+$ は何でしょうか?次のセクションで詳しく見てみましょう。

正の部分関数 - 折れ点を作る道具

$(X - \xi)_+$ という関数をもう少し詳しく見てみましょう。

この関数は、ノット $\xi$ を境に「折れ曲がる」関数です。

具体例で考えます。$\xi = 30$ のとき:

つまり、ノット $\xi$ より左では0、右では右上がりの直線になります。

正の部分関数 (X - ξ)+ の動作
正の部分関数:ノットで折れ曲がる

なぜこれが便利なのか?

この関数を基底に加えると、自動的に連続性が保証されます。 ノットより左では影響なし(0を足すだけ)、ノットより右では傾きが変わる。 そして、ノットのちょうど境目でも値が連続につながる。

これが区分的多項式を「連続に保ちながら」構成するための基本ツールです。

$$(X - \xi)_+ = \begin{cases} 0 & \text{if } X < \xi \\ X - \xi & \text{if } X \geq \xi \end{cases}$$

別の書き方:$(X - \xi)_+ = \max(0, X - \xi)$

この「折れ点」を複数配置することで、複雑な形状を連続的に表現できます。

3次スプライン - なめらかさの追求

区分的線形関数では、ノットで「カクッ」と折れ曲がります。 これをもっとなめらかにしたい。

そこで登場するのが「3次スプライン(cubic spline)」です。

各区間で3次多項式を使い、さらに強い制約を加えます:

制約意味直感的な説明
関数値が連続つながっている隙間がない
傾きが連続同じ方向を向いている角がない
曲がり具合が連続同じカーブの強さなめらかに曲がる

この3つの条件を満たすと、人間の目にはほぼ完全になめらかに見えます。

「傾き」は数学的には1階微分、「曲がり具合」は2階微分と呼ばれますが、今は直感的な理解で十分です。

3次スプラインのなめらかさを強調
左:区分的線形(角ばる) vs 右:3次スプライン(なめらか)

K個のノットを持つ3次スプラインの基底(切断べき基底):

通常の多項式部分(全体の形を決める):

$$h_1(X) = 1, \quad h_2(X) = X, \quad h_3(X) = X^2, \quad h_4(X) = X^3$$

各ノットでの「折れ」を追加:

$$h_{4+\ell}(X) = (X - \xi_\ell)^3_+, \quad \ell = 1, \ldots, K$$

合計で $4 + K$ 個の基底関数になります。

3乗の正の部分関数の巧妙さ

3次スプラインで使う $(X - \xi)^3_+$ を見てみましょう。

この関数の巧妙なところは、ノットで値・傾き・曲がり具合がすべて0になること。

なぜでしょうか?

ノット $\xi$ のちょうど位置で考えてみます:

だから、この関数を追加しても、ノットでの連続性が壊れない。右側でのみ形を変えられるのです。

切断べき基底関数 (X - ξ)³+ の形状
2つのノットでの切断べき基底:それぞれのノットから立ち上がる

2つのノット $\xi_1, \xi_2$ の例では、基底は6個:

$$1, \quad X, \quad X^2, \quad X^3, \quad (X - \xi_1)^3_+, \quad (X - \xi_2)^3_+$$

この6個の基底で、なめらかな3次スプラインを表現できます。

自然スプライン - 端の問題を解決

3次スプラインにはまだ1つ問題があります。

思い出してください。最初の問題は「端っこで暴れる」ことでした。 3次スプラインでも、両端のノットより外側では、曲線が不安定になりやすい。 3次関数は端に行くほど急激に増加または減少するからです。

この問題を解決するのが「自然スプライン(natural spline)」です。

アイデアはシンプル:両端のノットより外側では、3次ではなく1次(直線)にする

境界の外で「曲がり具合」を0に固定すると、曲線は端で直線的に伸びていきます。 暴れることがなくなり、予測が安定します。

自然スプラインの境界での線形化
通常スプライン(端で暴走)→ 自然スプライン(端が安定)

自然スプラインの制約(境界の外で曲がり具合=0):

$$f''(X) = 0 \quad \text{for } X < \xi_1 \text{ or } X > \xi_K$$

$f''$ は「2階微分」で、曲がり具合を表します。これが0ということは、直線であるということです。

自由度のトレードオフ

ここで立ち止まって、パラメータの数について考えてみましょう。

「自由度」とは、モデルが持つ調整可能なパラメータの数です。

スプラインの種類ノット数自由度
通常の3次スプラインKK + 4
自然スプラインKK

自然スプラインは4つ少ない。この「失った」自由度は、境界での制約に使われています。

しかし、これは損失ではありません。

境界付近はデータが少ないことが多い。そこで高い柔軟性を持っても、信頼性のある推定はできません。 むしろ、制約を加えてシンプルにした方が、予測が安定する。

通常スプラインと自然スプラインの自由度比較
上:通常スプライン(K+4個のパラメータ) vs 下:自然スプライン(K個、端を制約)

内側では十分な柔軟性を保ちながら、外側では安定した予測を実現する。 これが自然スプラインの強みです。

$$\text{通常の3次スプライン: } K + 4 \text{ 自由度}$$
$$\text{自然スプライン: } K \text{ 自由度}$$

4つの自由度は、境界での「曲がり具合=0」という制約に使われています。

B-スプライン - 実装の工夫

理論を理解したところで、実際に計算するときの話をしましょう。

ここまで見てきた「切断べき基底」$(X - \xi)^3_+$ は、概念的にはわかりやすい。 しかし、実際の計算では問題があります。

$X$ が大きくなると、$(X - \xi)^3$ は急激に大きな値を取ります。 これは数値計算で誤差を生みやすい。

そこで使われるのが「B-スプライン(B-spline)」です。

B-スプラインは、同じ曲線を表現できますが、基底関数の形が違います。 各基底関数は「狭い範囲でのみ値を持つ山型」の関数です。 一定の範囲外では完全に0になるため、数値的に安定で、計算も効率的です。

B-スプライン基底関数の局所性
B-スプライン基底:各基底は局所的な山型、狭い範囲でのみ値を持つ

数式は複雑に見えますが、要点は「局所的な山型の関数を並べて曲線を作る」ということです。

理論を理解するには切断べき基底、実装にはB-スプラインという使い分けが一般的です。

B-スプライン基底 $B_{i,m}(x)$ は再帰的に定義されます。 数式は参考程度に。重要なのは「局所的な山型関数」であるということです。

$$B_{i,1}(x) = I(\tau_i \leq x < \tau_{i+1})$$
$$B_{i,m}(x) = \frac{x - \tau_i}{\tau_{i+m-1} - \tau_i} B_{i,m-1}(x) + \frac{\tau_{i+m} - x}{\tau_{i+m} - \tau_{i+1}} B_{i+1,m-1}(x)$$

まとめ - レゴブロックのように曲線を作る

区分的多項式とスプラインの旅を振り返りましょう。

スプラインは、レゴブロックのようなものです。 小さなパーツ(基底関数)を組み合わせて、どんな形でも作れる。 でも、つなぎ目がなめらかになるように、ブロックの形を工夫している。

出発点: 1本の多項式では、端で暴れる問題があった。

解決策の進化:

  1. 区分的定数 → データを区切る発想(でも階段状)
  2. 区分的線形 → 傾きを持てる(でも角ばる)
  3. 3次スプライン → なめらか(でも端で不安定)
  4. 自然スプライン → 端を線形に制約して安定化
スプラインの進化を1つのアニメーションで要約
スプラインの進化:階段 → 折れ線 → なめらか → 安定

実装のコツ: B-スプライン基底を使うと数値的に安定。

スプラインは、局所的な柔軟性全体的ななめらかさを両立する強力なツールです。

$$f(X) = \sum_{j=1}^{M} \beta_j h_j(X)$$

基底関数 $h_j$ の選び方で、柔軟性と安定性のバランスが決まります。

次のセクションでは、「ノットをいくつ、どこに置くか」という重要な問題を扱います。

この章のまとめ

次のセクションでは、スムージングスプラインという、ノット配置を自動で最適化する手法を学びます。