5.2 区分的多項式とスプライン
来週の気温を予測したい。過去のデータに曲線をフィットさせて、未来を推測する。 ところが、予測モデルが「来週はマイナス100度です」と言い出した...。
これは冗談ではありません。1本の多項式でデータをフィットしようとすると、端っこで暴走することがあるのです。
この章では、この問題を解決する「区分的多項式」と「スプライン」の考え方を見ていきます。 データを区間に分けて、それぞれに別の曲線を当てはめる。そして、つなぎ目をなめらかにする。 シンプルですが、驚くほど強力なアイデアです。
この章の流れ:
- なぜ1本の多項式ではダメなのか?
- 「区切って考える」という発想
- つなぎ目をなめらかにする工夫
- 端っこを安定させる「自然スプライン」
1本の多項式の限界
データに曲線をフィットさせる方法として、多項式を使うことができます。$X, X^2, X^3...$ を組み合わせて、データに合う曲線を作る方法です。
でも、ここで問題が起きます。
例えば、「年齢と収入の関係」を予測したいとします。 20代〜50代のデータはたくさんあるけど、10代や60代以上のデータは少ない。 データの中央部分に合わせて多項式の次数を上げていくと...

端っこで曲線が暴れ始めます。「65歳の予測収入:マイナス500万円」なんて結果が出てしまう。
これは「グローバルな多項式」の宿命です。1つの式で全体を表現しようとするから、一部を調整すると他の部分まで影響を受けてしまう。
この式で、$d$(次数)を上げれば複雑なパターンに対応できます。 しかし、式全体が1つにつながっているため、一部を変えると全体に影響が及びます。
では、どうすればいいのでしょうか?
「区切って考える」という発想
ここで、シンプルだけど強力なアイデアがあります。
データの範囲を区切って、各区間で別々の曲線を当てはめる。
例えば、年齢データが20歳から60歳まであるとします。 30歳と50歳で区切って、3つの区間に分ける:
- 20〜30歳:区間1
- 30〜50歳:区間2
- 50〜60歳:区間3
そして、各区間で独立に曲線をフィットさせる。
この区切り点のことを「ノット(knot)」と呼びます。結び目という意味ですね。
最もシンプルなのは、各区間で定数(水平な直線)を当てはめる方法。 これを「区分的定数関数」と呼びます。階段のような形になります。

区分的定数関数を数式で書くと、「指示関数」$I(\cdot)$ を使います。 これは「条件が成り立てば1、そうでなければ0」を返す関数です。
例えば $I(X < 30)$ は:
- $X = 25$ のとき → 1(条件が真)
- $X = 35$ のとき → 0(条件が偽)
2つのノット $\xi_1, \xi_2$ で分割した区分的定数関数の基底:
区分的線形関数 - もう少し柔軟に
定数では少し単純すぎますね。各区間で傾きを持たせたい。
そこで、各区間に1次関数(直線)を当てはめます。これが「区分的線形関数」です。
3つの区間があれば、3本の独立な直線。合計で6つのパラメータ(切片3つ、傾き3つ)が必要になります。
でも、ここで気づくことがあります。
隣り合う区間の直線が、ノットでつながっていない。ガクッと段差ができてしまう。 これでは「年齢30歳になった瞬間に収入が急に100万円上がる」みたいな不自然な予測になってしまいます。

「つなぎ目でも連続にしたい」という制約を加えてみましょう。
連続性の制約を加えた区分的線形関数の基底:
ここで $(X - \xi)_+$ は「正の部分関数」。マイナスになったら0に切り捨てる関数です。
でも、この謎めいた記号 $(X - \xi)_+$ は何でしょうか?次のセクションで詳しく見てみましょう。
正の部分関数 - 折れ点を作る道具
$(X - \xi)_+$ という関数をもう少し詳しく見てみましょう。
この関数は、ノット $\xi$ を境に「折れ曲がる」関数です。
具体例で考えます。$\xi = 30$ のとき:
- $X = 25$ のとき:$25 - 30 = -5$ → マイナスなので 0
- $X = 30$ のとき:$30 - 30 = 0$ → ちょうど 0
- $X = 35$ のとき:$35 - 30 = 5$ → プラスなので 5
つまり、ノット $\xi$ より左では0、右では右上がりの直線になります。

なぜこれが便利なのか?
この関数を基底に加えると、自動的に連続性が保証されます。 ノットより左では影響なし(0を足すだけ)、ノットより右では傾きが変わる。 そして、ノットのちょうど境目でも値が連続につながる。
これが区分的多項式を「連続に保ちながら」構成するための基本ツールです。
別の書き方:$(X - \xi)_+ = \max(0, X - \xi)$
この「折れ点」を複数配置することで、複雑な形状を連続的に表現できます。
3次スプライン - なめらかさの追求
区分的線形関数では、ノットで「カクッ」と折れ曲がります。 これをもっとなめらかにしたい。
そこで登場するのが「3次スプライン(cubic spline)」です。
各区間で3次多項式を使い、さらに強い制約を加えます:
| 制約 | 意味 | 直感的な説明 |
|---|---|---|
| 関数値が連続 | つながっている | 隙間がない |
| 傾きが連続 | 同じ方向を向いている | 角がない |
| 曲がり具合が連続 | 同じカーブの強さ | なめらかに曲がる |
この3つの条件を満たすと、人間の目にはほぼ完全になめらかに見えます。
「傾き」は数学的には1階微分、「曲がり具合」は2階微分と呼ばれますが、今は直感的な理解で十分です。

K個のノットを持つ3次スプラインの基底(切断べき基底):
通常の多項式部分(全体の形を決める):
各ノットでの「折れ」を追加:
合計で $4 + K$ 個の基底関数になります。
3乗の正の部分関数の巧妙さ
3次スプラインで使う $(X - \xi)^3_+$ を見てみましょう。
この関数の巧妙なところは、ノットで値・傾き・曲がり具合がすべて0になること。
なぜでしょうか?
ノット $\xi$ のちょうど位置で考えてみます:
- 関数値:$(0)^3 = 0$
- 傾き:$3 \times (0)^2 = 0$
- 曲がり具合:$6 \times (0) = 0$
だから、この関数を追加しても、ノットでの連続性が壊れない。右側でのみ形を変えられるのです。

2つのノット $\xi_1, \xi_2$ の例では、基底は6個:
この6個の基底で、なめらかな3次スプラインを表現できます。
自然スプライン - 端の問題を解決
3次スプラインにはまだ1つ問題があります。
思い出してください。最初の問題は「端っこで暴れる」ことでした。 3次スプラインでも、両端のノットより外側では、曲線が不安定になりやすい。 3次関数は端に行くほど急激に増加または減少するからです。
この問題を解決するのが「自然スプライン(natural spline)」です。
アイデアはシンプル:両端のノットより外側では、3次ではなく1次(直線)にする。
境界の外で「曲がり具合」を0に固定すると、曲線は端で直線的に伸びていきます。 暴れることがなくなり、予測が安定します。

自然スプラインの制約(境界の外で曲がり具合=0):
$f''$ は「2階微分」で、曲がり具合を表します。これが0ということは、直線であるということです。
自由度のトレードオフ
ここで立ち止まって、パラメータの数について考えてみましょう。
「自由度」とは、モデルが持つ調整可能なパラメータの数です。
- 自由度が多い → 複雑な形に対応できる(でも過学習のリスク)
- 自由度が少ない → シンプルだが柔軟性に欠ける
| スプラインの種類 | ノット数 | 自由度 |
|---|---|---|
| 通常の3次スプライン | K | K + 4 |
| 自然スプライン | K | K |
自然スプラインは4つ少ない。この「失った」自由度は、境界での制約に使われています。
しかし、これは損失ではありません。
境界付近はデータが少ないことが多い。そこで高い柔軟性を持っても、信頼性のある推定はできません。 むしろ、制約を加えてシンプルにした方が、予測が安定する。

内側では十分な柔軟性を保ちながら、外側では安定した予測を実現する。 これが自然スプラインの強みです。
4つの自由度は、境界での「曲がり具合=0」という制約に使われています。
B-スプライン - 実装の工夫
理論を理解したところで、実際に計算するときの話をしましょう。
ここまで見てきた「切断べき基底」$(X - \xi)^3_+$ は、概念的にはわかりやすい。 しかし、実際の計算では問題があります。
$X$ が大きくなると、$(X - \xi)^3$ は急激に大きな値を取ります。 これは数値計算で誤差を生みやすい。
そこで使われるのが「B-スプライン(B-spline)」です。
B-スプラインは、同じ曲線を表現できますが、基底関数の形が違います。 各基底関数は「狭い範囲でのみ値を持つ山型」の関数です。 一定の範囲外では完全に0になるため、数値的に安定で、計算も効率的です。

数式は複雑に見えますが、要点は「局所的な山型の関数を並べて曲線を作る」ということです。
理論を理解するには切断べき基底、実装にはB-スプラインという使い分けが一般的です。
B-スプライン基底 $B_{i,m}(x)$ は再帰的に定義されます。 数式は参考程度に。重要なのは「局所的な山型関数」であるということです。
まとめ - レゴブロックのように曲線を作る
区分的多項式とスプラインの旅を振り返りましょう。
スプラインは、レゴブロックのようなものです。 小さなパーツ(基底関数)を組み合わせて、どんな形でも作れる。 でも、つなぎ目がなめらかになるように、ブロックの形を工夫している。
出発点: 1本の多項式では、端で暴れる問題があった。
解決策の進化:
- 区分的定数 → データを区切る発想(でも階段状)
- 区分的線形 → 傾きを持てる(でも角ばる)
- 3次スプライン → なめらか(でも端で不安定)
- 自然スプライン → 端を線形に制約して安定化

実装のコツ: B-スプライン基底を使うと数値的に安定。
スプラインは、局所的な柔軟性と全体的ななめらかさを両立する強力なツールです。
基底関数 $h_j$ の選び方で、柔軟性と安定性のバランスが決まります。
次のセクションでは、「ノットをいくつ、どこに置くか」という重要な問題を扱います。
この章のまとめ
- 1本の多項式の限界: 端で暴れる、全体が連動してしまう
- 区分的多項式: データを区切って、各区間で別の曲線をフィット
- 正の部分関数: $(X - \xi)_+$ で連続性を保ちながら折れ点を作る
- 3次スプライン: 値・傾き・曲がり具合が連続、なめらかな曲線
- 自然スプライン: 境界を線形に制約して端での安定性を確保
- B-スプライン: 数値計算に適した局所的な基底関数
次のセクションでは、スムージングスプラインという、ノット配置を自動で最適化する手法を学びます。