ガウス過程(Gaussian Process, GP)を初めて学ぶと、たいてい「関数上の確率分布」という説明に出会います。けれども、確率分布といえば普通はサイコロの目やコインの裏表、あるいは身長のヒストグラムのように「数」の上に定義されるものです。では「関数の上に分布を置く」とは、いったいどういう意味なのでしょうか。無限に多くの点 $f(x)$ をまとめて確率変数だと思う、というのは直感的にはわかっても、数学的にはどう正当化されるのでしょうか。
この問いに正面から答えるのが、本記事のテーマです。ガウス過程は、実用上は「カーネルを選んで事後分布を計算する便利な道具」として使われます。しかしその裏側には、関数解析の美しい理論——Mercerの定理による固有関数展開、再生核ヒルベルト空間(RKHS) の再生性、そしてrepresenter定理——が静かに支えています。これらを理解すると、なぜガウス過程回帰の事後平均がカーネルリッジ回帰と一致するのか、なぜカーネルを選ぶことが「関数の滑らかさを選ぶ」ことに等しいのか、といった疑問が一本の線でつながります。
この理論を学ぶ価値は具体的です。第一に、カーネル設計の指針が得られます。Mercerの固有値の減衰を理解すれば、RBFカーネルがなぜ極端に滑らかな関数を好むのかが見抜けます。第二に、正則化との橋渡しができます。GPの事後平均はRKHSノルムを正則化項とする変分問題の解であり、これがサポートベクターマシンやカーネルリッジ回帰と同じ枠組みに乗ることがわかります。本記事ではこの双対性を、数式の導出を省かずに、Pythonの数値確認を交えて丁寧にたどっていきます。
本記事の内容
- 有限次元ガウス分布の次元を無限に増やすという直感から、関数上の分布へ
- weight-space view(ベイズ線形回帰)と function-space view(GP)の双対性の導出
- Mercerの定理:正定値カーネルの固有関数展開 $k(x,x’)=\sum_i \lambda_i \phi_i(x)\phi_i(x’)$
- 再生核ヒルベルト空間(RKHS)と再生性 $f(x)=\langle f, k(x,\cdot)\rangle$
- representer定理とGP事後平均=カーネルリッジ回帰の一致
- Karhunen-Loève展開、そして「GPサンプルはRKHSに(測度1で)入らない」という微妙な事実
- Pythonによる固有関数展開・KL展開・GP=KRRの数値確認
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
直感:有限次元ガウスを無限次元に伸ばす
ガウス過程を理解する出発点は、すでによく知っている多変量ガウス分布です。$n$ 個の確率変数 $(f_1, f_2, \dots, f_n)$ が平均ベクトル $\bm{\mu}$、共分散行列 $\bm{K}$ の多変量ガウス分布に従うとき、その密度は
$$ p(\bm{f}) = \frac{1}{(2\pi)^{n/2}|\bm{K}|^{1/2}} \exp\left(-\frac{1}{2}(\bm{f}-\bm{\mu})^T \bm{K}^{-1}(\bm{f}-\bm{\mu})\right) $$
で与えられます。ここで $f_i$ を「ある入力点 $x_i$ における関数値 $f(x_i)$」だと読み替えてみましょう。すると共分散行列の要素 $K_{ij}$ は、点 $x_i$ と点 $x_j$ における関数値の相関を表すことになります。
このとき、点の個数 $n$ をどんどん増やしていったらどうなるでしょうか。2点なら2変量ガウス、8点なら8変量ガウス、200点なら200変量ガウス——そして点を空間中に無限に密に敷き詰める極限を考えると、「関数全体の上の分布」が立ち上がってきます。これがガウス過程です。

左の図は2点だけの場合で、$(f(x_1), f(x_2))$ が相関した2変量ガウスとして散らばっています。中央は8点に増やし、サンプルされた点列を線で結んだもので、すでに「ぎこちない関数」のように見えます。右は200点まで密にした極限で、サンプルは完全に滑らかな関数として現れています。点の個数を増やすほど「関数の標本」に近づくこと、そしてその滑らかさが共分散の構造(隣り合う点の相関の強さ)で決まることが読み取れます。
ガウス過程の正式な定義は、この直感をそのまま厳密化したものです。
定義(ガウス過程) 確率過程 $\{f(x)\}_{x \in \mathcal{X}}$ がガウス過程であるとは、任意の有限個の点 $x_1, \dots, x_n \in \mathcal{X}$ に対して、$(f(x_1), \dots, f(x_n))$ が多変量ガウス分布に従うことをいう。
つまり「どこを有限個切り出して見ても多変量ガウスになっている」ことがガウス過程の条件です。この性質は 有限次元周辺分布が整合的(consistent)にガウスである と言い換えられ、コルモゴロフの拡張定理によって、無限次元の確率測度がちゃんと存在することが保証されます。ガウス過程は、平均関数 $m(x) = \mathbb{E}[f(x)]$ と共分散関数(カーネル)$k(x,x’) = \mathrm{Cov}(f(x), f(x’))$ の二つだけで完全に決まり、$f \sim \mathcal{GP}(m, k)$ と書きます。
この「関数上の分布」という対象を、もう少し掘り下げてみましょう。実は同じガウス過程を眺めるのに、まったく異なる二つの視点があります。一つは「パラメータ(重み)の上の分布」として見る視点、もう一つは「関数そのものの上の分布」として見る視点です。次節ではこの二つを行き来します。
weight-space view:ベイズ線形回帰から出発する
ガウス過程に到達するもう一つの道は、ベイズ線形回帰です。こちらは「関数を有限個のパラメータで表し、そのパラメータに確率分布を置く」という、よりなじみやすい立場から始まります。これを weight-space view(重み空間ビュー) と呼びます。
入力 $\bm{x}$ を特徴写像 $\bm{\phi}(\bm{x}) = (\phi_1(\bm{x}), \dots, \phi_D(\bm{x}))^T$ で $D$ 次元に持ち上げ、重み $\bm{w} \in \mathbb{R}^D$ との線形結合で関数を表します。
$$ f(\bm{x}) = \bm{\phi}(\bm{x})^T \bm{w} $$
ベイズ的には、重み $\bm{w}$ に事前分布として平均ゼロのガウス分布 $\bm{w} \sim \mathcal{N}(\bm{0}, \Sigma_p)$ を置きます。ここで肝心なのは、$f(\bm{x})$ は $\bm{w}$ の線形変換なので、$f$ もまたガウス分布に従うという点です。具体的に、任意の点 $\bm{x}, \bm{x}’$ における関数値の平均と共分散を計算してみましょう。
まず平均は、$\mathbb{E}[\bm{w}] = \bm{0}$ なので
$$ \mathbb{E}[f(\bm{x})] = \bm{\phi}(\bm{x})^T \mathbb{E}[\bm{w}] = 0 $$
です。共分散は、定義に従って展開します。
$$ \begin{aligned} \mathrm{Cov}(f(\bm{x}), f(\bm{x}’)) &= \mathbb{E}\big[f(\bm{x}) f(\bm{x}’)\big] – \mathbb{E}[f(\bm{x})]\mathbb{E}[f(\bm{x}’)] \\ &= \mathbb{E}\big[\bm{\phi}(\bm{x})^T \bm{w}\, \bm{w}^T \bm{\phi}(\bm{x}’)\big] – 0 \\ &= \bm{\phi}(\bm{x})^T \mathbb{E}[\bm{w}\bm{w}^T] \bm{\phi}(\bm{x}’) \end{aligned} $$
ここで2行目から3行目では、$\bm{\phi}(\bm{x})$ と $\bm{\phi}(\bm{x}’)$ は確率変数 $\bm{w}$ に依存しない定数なので、期待値の外に出しています。最後に $\mathbb{E}[\bm{w}\bm{w}^T] = \Sigma_p$(事前共分散)を代入すると、
$$ \mathrm{Cov}(f(\bm{x}), f(\bm{x}’)) = \bm{\phi}(\bm{x})^T \Sigma_p \bm{\phi}(\bm{x}’) \equiv k(\bm{x}, \bm{x}’) $$
が得られます。つまり、ベイズ線形回帰のモデルは平均ゼロ・共分散関数 $k(\bm{x},\bm{x}’) = \bm{\phi}(\bm{x})^T \Sigma_p \bm{\phi}(\bm{x}’)$ のガウス過程に他なりません。重みに事前分布を置くことは、関数に共分散構造を与えることと等価だったのです。
ここで重要な観察があります。最終的な予測には、特徴写像 $\bm{\phi}$ そのものは現れず、内積の形 $\bm{\phi}(\bm{x})^T \Sigma_p \bm{\phi}(\bm{x}’)$ だけが現れます。$\Sigma_p$ が正定値なら $\Sigma_p = \Sigma_p^{1/2}\Sigma_p^{1/2}$ と分解でき、$\psi(\bm{x}) = \Sigma_p^{1/2}\bm{\phi}(\bm{x})$ と置けば $k(\bm{x},\bm{x}’) = \psi(\bm{x})^T\psi(\bm{x}’)$ という素直な内積になります。これがカーネルトリックの出発点です。
このとき自然な疑問が生まれます。$D$(特徴の数)はどこまで大きくしてよいのでしょうか。無限に大きくしたら何が起きるのでしょうか。実は $D \to \infty$ の極限こそが、次に見る function-space view と直結します。
function-space view と双対性
weight-space view では、関数を $f(\bm{x}) = \bm{\phi}(\bm{x})^T\bm{w}$ という有限次元のパラメータで表しました。これに対し function-space view(関数空間ビュー) では、パラメータを一切経由せず、関数 $f$ そのものに直接ガウス過程を置きます。
$$ f \sim \mathcal{GP}(0, k), \qquad k(\bm{x},\bm{x}’) = \bm{\phi}(\bm{x})^T \Sigma_p \bm{\phi}(\bm{x}’) $$
前節で見たとおり、この二つは同じ確率モデルを記述しています。weight-space view は「$D$ 個のパラメータ $\bm{w}$ 上の分布」、function-space view は「無限次元の関数空間上の分布」。両者をつなぐのが共分散関数(カーネル)$k$ です。

この図は二つのビューの対応を整理したものです。左の重み空間ビューでは、特徴写像で持ち上げて重み $\bm{w}$ に事前分布 $\mathcal{N}(0,\Sigma_p)$ を置く——これはベイズ線形回帰そのものです。右の関数空間ビューでは、関数に直接 $\mathcal{GP}(0,k)$ を置く。そして両者は $k = \bm{\phi}^T\Sigma_p\bm{\phi}$ という関係で結ばれています。重み空間の次元は特徴の数 $D$、関数空間の次元は形式的に無限大です。同じ対象を「有限次元のパラメータ」から見るか「無限次元の関数」から見るかの違いに過ぎないことが読み取れます。
この双対性が実用上きわめて強力なのは、計算量の観点からです。weight-space view では $D \times D$ の行列を扱う必要があり、$D$ が大きい(特に無限)と破綻します。ところが function-space view では、$N$ 個の観測点に対する $N \times N$ のグラム行列 $\bm{K}$(要素 $K_{ij} = k(\bm{x}_i, \bm{x}_j)$)だけを扱えばよく、$D$ には依存しません。RBFカーネルのように $D = \infty$(無限次元の特徴空間に対応)であっても、$N \times N$ の計算で済むのです。
しかし、ここで根本的な疑問が残ります。カーネル $k(\bm{x},\bm{x}’) = \bm{\phi}(\bm{x})^T\Sigma_p\bm{\phi}(\bm{x}’)$ は、必ず何らかの特徴写像 $\bm{\phi}$ から作られるのでしょうか。逆に、適当に決めたカーネル関数(たとえばRBF)に対して、それを内積として表す特徴写像は本当に存在するのでしょうか。この問いに「正定値カーネルなら必ず存在する」と答えるのが、次に見るMercerの定理です。
Mercerの定理と固有関数展開
カーネル $k(x,x’)$ を「対称行列の連続版」だと思ってみましょう。対称行列は固有値分解できます。では、カーネルという「無限次元の対称作用素」も固有値分解できるのでしょうか。できるとすれば、固有値と固有ベクトルにあたるものは何でしょうか。これに答えるのがMercerの定理です。
積分作用素とその固有関数
カーネル $k$ に対して、関数 $g$ を次のように変換する積分作用素 $T_k$ を考えます。
$$ (T_k g)(x) = \int_{\mathcal{X}} k(x, x’)\, g(x’)\, p(x’)\, \mathrm{d}x’ $$
ここで $p(x’)$ は入力空間上の測度(たとえば一様分布や入力データの分布)です。これは行列とベクトルの積 $(\bm{K}\bm{g})_i = \sum_j K_{ij} g_j$ の連続版にあたります。和が積分に、添字が連続変数に置き換わっただけです。
この作用素の固有関数 $\phi_i$ と固有値 $\lambda_i$ は、行列の固有値問題 $\bm{K}\bm{v} = \lambda \bm{v}$ の連続版
$$ (T_k \phi_i)(x) = \lambda_i \phi_i(x), \qquad i = 1, 2, \dots $$
で定義されます。$k$ が対称($k(x,x’) = k(x’,x)$)かつ正定値であれば、$T_k$ は自己共役な正作用素となり、固有値はすべて非負 $\lambda_i \geq 0$、固有関数は $L^2(p)$ で正規直交系をなします。すなわち
$$ \int_{\mathcal{X}} \phi_i(x)\phi_j(x)\, p(x)\, \mathrm{d}x = \delta_{ij} $$
が成り立ちます。これは対称行列の固有ベクトルが直交するのとまったく同じ構造です。
Mercerの定理の主張
ここからがMercerの定理の核心です。連続な正定値カーネル $k$ は、その固有値と固有関数を使って次のように展開できます。
$$ \boxed{\;k(x, x’) = \sum_{i=1}^{\infty} \lambda_i \,\phi_i(x)\,\phi_i(x’)\;} $$
この級数は(適切な条件のもとで)絶対かつ一様に収束します。これがMercerの定理です。直感的には、「対称行列 $\bm{K} = \sum_i \lambda_i \bm{v}_i \bm{v}_i^T$ という固有値分解(スペクトル分解)の、無限次元・連続版」だと理解できます。
この展開がもたらす重要な帰結は、カーネルが内積として表せることです。$\psi_i(x) = \sqrt{\lambda_i}\,\phi_i(x)$ という特徴写像 $\bm{\psi}(x) = (\psi_1(x), \psi_2(x), \dots)$ を定義すると、
$$ k(x, x’) = \sum_{i=1}^{\infty} \big(\sqrt{\lambda_i}\phi_i(x)\big)\big(\sqrt{\lambda_i}\phi_i(x’)\big) = \sum_{i=1}^{\infty}\psi_i(x)\psi_i(x’) = \langle \bm{\psi}(x), \bm{\psi}(x’)\rangle_{\ell^2} $$
となります。つまり、正定値カーネルは必ず「(無限次元の)特徴空間における内積」として表現できるのです。前節の疑問——「RBFカーネルに対応する特徴写像は存在するか」——への答えは、Mercerの定理によって「正定値である限り、必ず存在する(しかも無限次元)」となります。これがカーネルトリックの理論的正当化です。
数値で確かめる固有関数展開
積分作用素の固有値問題は、入力空間を細かく離散化(Nyström近似)すると、グラム行列の固有値問題に帰着します。下の図は、$[-3,3]$ 上の一様測度でRBFカーネル(長さスケール $\ell=0.7$)を離散化し、固有値分解した結果です。

上段左はカーネル行列そのもの、中央は固有値スペクトルで、すべて非負(半正定値)になっているため Mercer展開が可能なことを示します。上段右の上位3つの固有関数は、インデックスが上がるにつれて振動の回数が増えていきます——これはフーリエ基底(正弦波)に似た振る舞いで、大きな固有値ほど「ゆるやかな(低周波の)」固有関数に対応することを意味します。下段は、Mercer展開を上位 $1, 3, 10$ 項で打ち切ったときのカーネルの断面 $k(x,0)$ の再構成です。項数を増やすにつれて真のカーネルにぴたりと近づき、10項もあればほぼ完全に再現できることが読み取れます。
固有値が大きいほど重要であり、しかも急速に減衰する——この事実はカーネルの性質を決定的に左右します。次節で固有値の減衰そのものを詳しく見てみましょう。
固有値の減衰とカーネルの滑らかさ
Mercer展開 $k(x,x’) = \sum_i \lambda_i \phi_i(x)\phi_i(x’)$ において、固有値 $\lambda_i$ の減衰の速さは、そのカーネルが生成する関数の滑らかさを直接反映します。固有値が速く減衰するほど、高周波の固有関数の寄与が小さくなり、関数は滑らかになります。

この図は、RBF(長さスケール2種)、Matérn $\nu=3/2$、OU(Ornstein-Uhlenbeck、指数カーネル)の固有値スペクトルを比較したものです。左は線形軸、右は対数軸です。対数軸を見ると違いが鮮明です。RBFカーネルの固有値はほぼ直線的に(対数軸で)下がっており、これは超指数的な減衰($\lambda_i \sim e^{-ci^2}$ のオーダー)を意味します。一方、Matérn や OU の固有値は、対数軸でゆるやかに曲がりながら下がり、多項式的な減衰にとどまります。RBFが極端に滑らかな(無限回微分可能な)関数を生み、Matérn や OU が粗い関数を生むのは、この固有値減衰の違いに起因します。カーネルを選ぶことは、固有値の減衰パターン、ひいては関数の滑らかさを選ぶことだったのです。
Mercerの定理は「カーネルを固有関数で展開する」視点を与えました。次に視点を切り替え、「カーネルが張る関数空間そのもの」を考えます。これがRKHSです。
RKHSと再生性
Mercer展開で得た特徴写像 $\bm{\psi}(x) = (\sqrt{\lambda_i}\phi_i(x))_i$ を使うと、カーネルから自然に一つの関数空間が立ち上がります。これが再生核ヒルベルト空間(Reproducing Kernel Hilbert Space, RKHS) です。RKHSは、ガウス過程と正則化、そしてカーネル法すべてを統一する中心的な舞台です。
RKHSの構成
カーネル $k$ から作られるRKHS $\mathcal{H}_k$ は、次のように構成します。まず、各点 $\bm{x}$ に対して関数 $k(\bm{x}, \cdot)$(第1引数を $\bm{x}$ に固定し、第2引数を動かす関数)を考えます。これらの有限線形結合
$$ f(\cdot) = \sum_{i=1}^{n} \alpha_i\, k(\bm{x}_i, \cdot) $$
の全体を考え、それに次の内積を入れます。
$$ \langle k(\bm{x}, \cdot), k(\bm{x}’, \cdot)\rangle_{\mathcal{H}} = k(\bm{x}, \bm{x}’) $$
この内積を線形に拡張すると、$f = \sum_i \alpha_i k(\bm{x}_i, \cdot)$ と $g = \sum_j \beta_j k(\bm{x}’_j, \cdot)$ に対して
$$ \langle f, g\rangle_{\mathcal{H}} = \sum_{i,j} \alpha_i \beta_j\, k(\bm{x}_i, \bm{x}’_j) $$
が得られます。この内積空間の完備化(極限を取り込んだ閉じた空間)がRKHS $\mathcal{H}_k$ です。RKHSノルムは $\|f\|_{\mathcal{H}}^2 = \langle f, f\rangle_{\mathcal{H}}$ で定まります。

左の図は、各点 $x_i$ に対応する再生核 $k(x_i,\cdot)$ を描いたものです。これらがRKHSの「部品(基底要素)」になります。右の図は再生性を可視化したもので、関数 $f = \sum_j \alpha_j k(x_j,\cdot)$(黒線)に対して、評価点 $x_*$ における値 $f(x_*)$ が、$k(x_*,\cdot)$(橙の破線)との内積で取り出せることを示します。点 $x_*$ にカーネルを置き、$f$ と内積を取るだけで関数値が出る——これが再生性の威力です。
再生性の証明
RKHSの最も重要な性質が再生性(reproducing property) です。任意の $f \in \mathcal{H}_k$ と任意の点 $\bm{x}$ に対して、
$$ \boxed{\;f(\bm{x}) = \langle f, k(\bm{x}, \cdot)\rangle_{\mathcal{H}}\;} $$
が成り立ちます。「関数値は、その関数と再生核との内積で取り出せる」という性質です。$f = \sum_i \alpha_i k(\bm{x}_i, \cdot)$ の場合に確かめましょう。内積の線形性を使い、上で定めた内積の定義 $\langle k(\bm{x}_i,\cdot), k(\bm{x},\cdot)\rangle = k(\bm{x}_i, \bm{x})$ を代入すると、
$$ \begin{aligned} \langle f, k(\bm{x}, \cdot)\rangle_{\mathcal{H}} &= \left\langle \sum_i \alpha_i k(\bm{x}_i, \cdot),\; k(\bm{x}, \cdot)\right\rangle_{\mathcal{H}} \\ &= \sum_i \alpha_i \langle k(\bm{x}_i, \cdot), k(\bm{x}, \cdot)\rangle_{\mathcal{H}} \\ &= \sum_i \alpha_i\, k(\bm{x}_i, \bm{x}) \\ &= f(\bm{x}) \end{aligned} $$
となります。最後の等号は、$f(\bm{x}) = \sum_i \alpha_i k(\bm{x}_i, \bm{x})$ という $f$ の定義そのものです。こうして再生性が示せました。$k(\bm{x},\cdot)$ は「点 $\bm{x}$ で評価する」という操作を内積で表現する特別な関数で、representer(表現子) と呼ばれます。
再生性のもう一つの帰結として、$f = k(\bm{x}, \cdot)$、$\bm{x}’ $ で評価すれば $\langle k(\bm{x},\cdot), k(\bm{x}’,\cdot)\rangle = k(\bm{x},\bm{x}’)$ となり、最初に定義した内積と整合します。これがRKHSが「カーネルを再生する空間」と呼ばれる由縁です。
Mercer展開とRKHSノルムの関係
Mercer固有関数を使うと、RKHSの正体がさらにはっきりします。$f = \sum_i a_i \phi_i$ と固有関数で展開したとき、RKHSノルムは
$$ \|f\|_{\mathcal{H}}^2 = \sum_{i=1}^{\infty} \frac{a_i^2}{\lambda_i} $$
と書けることが知られています。ここで重要なのは分母の $\lambda_i$ です。固有値 $\lambda_i$ が小さい(高周波の)成分 $a_i$ は、ノルムに大きく寄与します。つまり、RKHSノルムが有限であるためには、高周波成分が固有値の減衰より速く減衰しなければならない。これがRKHSが「滑らかな関数の空間」になる数学的な理由です。RBFカーネルのRKHSが極端に滑らかな関数だけを含むのは、固有値が超指数的に減衰するためなのです。
RKHSという舞台が整ったところで、いよいよ本記事の山場——representer定理に進みます。これは「RKHS上の正則化問題の解が、データ点の再生核の有限線形結合で書ける」という、機械学習全体を貫く定理です。
representer定理
ガウス過程回帰やカーネルリッジ回帰、サポートベクターマシンは、見かけは違っても、本質的に同じ最適化問題を解いています。それは「データへの適合」と「関数の滑らかさ(RKHSノルム)」のバランスを取る変分問題です。representer定理は、この無限次元の最適化問題の解が、たった $N$ 個(データ点の数)のパラメータで書けることを保証する、驚くべき定理です。
問題設定
RKHS $\mathcal{H}_k$ 上で、次の正則化付き最小化問題を考えます。
$$ \min_{f \in \mathcal{H}_k}\; \left[\; \sum_{i=1}^{N} L\big(y_i, f(\bm{x}_i)\big) + \frac{\lambda}{2}\|f\|_{\mathcal{H}}^2 \;\right] $$
第1項はデータへの適合度を測る損失(二乗誤差など)、第2項はRKHSノルムによる正則化(関数の複雑さへのペナルティ)です。$f$ は無限次元のRKHSの要素なので、ナイーブには無限個の自由度を最適化する必要があります。ところが——
representer定理の主張と証明
representer定理 上の最小化問題の解 $f^\star$ は、必ず次の形で書ける。 $$ f^\star(\cdot) = \sum_{i=1}^{N} \alpha_i\, k(\bm{x}_i, \cdot) $$
つまり、解はデータ点に置いた再生核の線形結合であり、最適化すべきは $N$ 個の係数 $\alpha_i$ だけです。無限次元の問題が有限次元に縮約されるのです。
証明の鍵は、RKHSを2つの直交する部分空間に分解することです。データ点が張る部分空間
$$ V = \mathrm{span}\{k(\bm{x}_1, \cdot), \dots, k(\bm{x}_N, \cdot)\} $$
と、その直交補空間 $V^\perp$ を考えます。任意の $f \in \mathcal{H}_k$ は一意に $f = f_\parallel + f_\perp$($f_\parallel \in V$、$f_\perp \in V^\perp$)と分解できます。
ここでポイントは、$f_\perp$ がデータ点での値に一切影響しないことです。再生性を使うと、各データ点 $\bm{x}_j$ における関数値は
$$ f(\bm{x}_j) = \langle f, k(\bm{x}_j, \cdot)\rangle_{\mathcal{H}} = \langle f_\parallel + f_\perp, k(\bm{x}_j, \cdot)\rangle_{\mathcal{H}} = \langle f_\parallel, k(\bm{x}_j, \cdot)\rangle_{\mathcal{H}} $$
となります。最後の等号では、$f_\perp \in V^\perp$ かつ $k(\bm{x}_j, \cdot) \in V$ なので内積がゼロ($\langle f_\perp, k(\bm{x}_j,\cdot)\rangle = 0$)になることを使いました。つまり、$f_\perp$ は損失項 $\sum_i L(y_i, f(\bm{x}_i))$ にまったく寄与しません。
一方、ノルムはピタゴラスの定理により
$$ \|f\|_{\mathcal{H}}^2 = \|f_\parallel\|_{\mathcal{H}}^2 + \|f_\perp\|_{\mathcal{H}}^2 \geq \|f_\parallel\|_{\mathcal{H}}^2 $$
を満たし、等号は $f_\perp = 0$ のときだけ成立します。つまり $f_\perp$ は損失を変えずに正則化項だけを増やす「純粋な損」です。したがって、目的関数を最小化するなら $f_\perp = 0$ とするのが最適で、解は $V$ の中、すなわち $f^\star = \sum_i \alpha_i k(\bm{x}_i, \cdot)$ の形に限られます。証明完了です。

この図は証明の幾何的な意味を表しています。青い帯はデータ点が張る有限次元部分空間 $V$、赤い点が最適解 $f^\star \in V$ です。緑の矢印で示した直交成分 $g \perp V$ を足すと(緑の点 $f^\star + g$)、データへの適合は変わらないのにRKHSノルムだけが増えてしまう——だから最適解は必ず $V$ の上に乗る、というのが定理の心です。無限次元の探索が、データ点の張る $N$ 次元の探索に化けることが視覚的に読み取れます。
この定理のおかげで、無限次元のRKHS上の問題が $N$ 個の係数の問題に落ちます。次節では、損失を二乗誤差に取った具体的な場合——カーネルリッジ回帰——を解き、それがガウス過程の事後平均とぴたり一致することを示します。
GP事後平均 = カーネルリッジ回帰
representer定理によって、解の形 $f^\star = \sum_i \alpha_i k(\bm{x}_i, \cdot)$ が決まりました。あとは係数 $\bm{\alpha}$ を具体的に求めるだけです。損失を二乗誤差にした場合がカーネルリッジ回帰(Kernel Ridge Regression, KRR) で、これがガウス過程回帰の事後平均と数式レベルで完全に一致することを見ます。
カーネルリッジ回帰の解
最小化問題で $L(y, f(\bm{x})) = \frac{1}{2}(y – f(\bm{x}))^2$ と取ります。
$$ J(f) = \frac{1}{2}\sum_{i=1}^{N}\big(y_i – f(\bm{x}_i)\big)^2 + \frac{\lambda}{2}\|f\|_{\mathcal{H}}^2 $$
representer定理より $f = \sum_j \alpha_j k(\bm{x}_j, \cdot)$ を代入します。データ点での値は $f(\bm{x}_i) = \sum_j \alpha_j k(\bm{x}_i, \bm{x}_j) = (\bm{K}\bm{\alpha})_i$($\bm{K}$ はグラム行列)、ノルムは $\|f\|_{\mathcal{H}}^2 = \sum_{i,j}\alpha_i\alpha_j k(\bm{x}_i,\bm{x}_j) = \bm{\alpha}^T\bm{K}\bm{\alpha}$ です。よって目的関数は $\bm{\alpha}$ の関数として
$$ J(\bm{\alpha}) = \frac{1}{2}\|\bm{y} – \bm{K}\bm{\alpha}\|^2 + \frac{\lambda}{2}\bm{\alpha}^T\bm{K}\bm{\alpha} $$
と書けます。$\bm{\alpha}$ で微分してゼロと置きます。
$$ \frac{\partial J}{\partial \bm{\alpha}} = -\bm{K}(\bm{y} – \bm{K}\bm{\alpha}) + \lambda \bm{K}\bm{\alpha} = \bm{0} $$
ここで $\bm{K}(\cdots)$ の形が共通因子として現れます。$\bm{K}$ が正則なら左から $\bm{K}^{-1}$ を掛けられて、
$$ -(\bm{y} – \bm{K}\bm{\alpha}) + \lambda\bm{\alpha} = \bm{0} \;\Longrightarrow\; (\bm{K} + \lambda \bm{I})\bm{\alpha} = \bm{y} $$
が得られます。よって最適係数は
$$ \boxed{\;\bm{\alpha} = (\bm{K} + \lambda\bm{I})^{-1}\bm{y}\;} $$
新しい点 $\bm{x}_*$ での予測は $f(\bm{x}_*) = \sum_i \alpha_i k(\bm{x}_i, \bm{x}_*) = \bm{k}_*^T(\bm{K}+\lambda\bm{I})^{-1}\bm{y}$ となります。ここで $\bm{k}_* = (k(\bm{x}_1,\bm{x}_*), \dots, k(\bm{x}_N,\bm{x}_*))^T$ です。
ガウス過程の事後平均
一方、ガウス過程回帰では、観測 $y_i = f(\bm{x}_i) + \varepsilon_i$($\varepsilon_i \sim \mathcal{N}(0,\sigma_n^2)$)のもとで、新しい点 $\bm{x}_*$ における事後平均が次で与えられます(導出はガウス過程回帰の記事を参照)。
$$ \bar{f}(\bm{x}_*) = \bm{k}_*^T(\bm{K} + \sigma_n^2\bm{I})^{-1}\bm{y} $$
二つの式を見比べてください。
$$ \underbrace{\bm{k}_*^T(\bm{K}+\lambda\bm{I})^{-1}\bm{y}}_{\text{KRR}} \quad=\quad \underbrace{\bm{k}_*^T(\bm{K}+\sigma_n^2\bm{I})^{-1}\bm{y}}_{\text{GP事後平均}} $$
両者は、正則化パラメータ $\lambda$ をノイズ分散 $\sigma_n^2$ と同一視すれば完全に一致します。すなわち $\lambda = \sigma_n^2$ のとき、カーネルリッジ回帰の予測とガウス過程の事後平均は同じ関数です。これは偶然ではありません。RKHSノルム正則化は、ガウス過程の事前分布が課す「滑らかさへの選好」と同じものを、変分問題の言葉で表現しているのです。
ただし重要な違いもあります。KRRは点推定(一本の関数)しか返しませんが、GPは事後分散まで返します。GPの事後分散 $\mathbb{V}[f(\bm{x}_*)] = k(\bm{x}_*,\bm{x}_*) – \bm{k}_*^T(\bm{K}+\sigma_n^2\bm{I})^{-1}\bm{k}_*$ は、データから離れた領域で予測がどれだけ不確かかを定量化します。平均は一致するが、不確実性の定量化はGPの専売特許——これが両者の関係の核心です。

左の図は、同じデータ・同じRBFカーネルで計算したGP事後平均(青実線)とKRR予測(赤破線)を重ね描きしたもので、完全に重なっています。薄い青の帯はGPの95%信頼区間で、これはKRRにはない情報です。右の図は両者の差の絶対値を対数軸でプロットしたもので、差は丸め誤差レベル(実質ゼロ)です。理論で示した「$\lambda=\sigma_n^2$ で一致する」ことが数値的にも厳密に成り立っていることが確認できます。
GPの平均がRKHS上の正則化問題の解であることを見ました。では、GPのサンプル関数そのものはどんな構造を持つのでしょうか。次節のKarhunen-Loève展開がそれを明らかにします。
Karhunen-Loève展開
ガウス過程からサンプルされる関数 $f$ は、いったいどんな「部品」からできているのでしょうか。Karhunen-Loève展開(KL展開) は、Mercerの固有関数を使ってこの問いに答えます。これは確率過程版の主成分分析(PCA)であり、関数を「無相関なガウス係数 × 固有関数」の和として表します。
KL展開の構成
平均ゼロのガウス過程 $f \sim \mathcal{GP}(0, k)$ を考え、Mercer展開 $k(x,x’) = \sum_i \lambda_i \phi_i(x)\phi_i(x’)$ を使います。すると、サンプル関数は次のように展開できます。
$$ \boxed{\;f(x) = \sum_{i=1}^{\infty} \sqrt{\lambda_i}\,\xi_i\,\phi_i(x), \qquad \xi_i \overset{\text{iid}}{\sim} \mathcal{N}(0,1)\;} $$
ここで $\xi_i$ は互いに独立な標準正規確率変数です。この展開が正しいことは、共分散を計算すれば確かめられます。$\xi_i$ が独立で $\mathbb{E}[\xi_i\xi_j] = \delta_{ij}$ なので、
$$ \begin{aligned} \mathrm{Cov}(f(x), f(x’)) &= \mathbb{E}\left[\sum_i \sqrt{\lambda_i}\xi_i\phi_i(x) \sum_j \sqrt{\lambda_j}\xi_j\phi_j(x’)\right] \\ &= \sum_{i,j}\sqrt{\lambda_i\lambda_j}\,\phi_i(x)\phi_j(x’)\,\mathbb{E}[\xi_i\xi_j] \\ &= \sum_{i}\lambda_i\,\phi_i(x)\phi_i(x’) \\ &= k(x, x’) \end{aligned} $$
となり、確かに正しい共分散を再現します。2行目から3行目では $\mathbb{E}[\xi_i\xi_j]=\delta_{ij}$ により $i=j$ の項だけが残ることを使いました。
KL展開の何が嬉しいかというと、ランダムさが無相関なガウス係数 $\xi_i$ に集約される点です。関数の不規則さは固有関数 $\phi_i$(決定的)に乗る重み $\sqrt{\lambda_i}\xi_i$ に押し込められ、しかも各成分が独立です。さらに、上位 $m$ 項で打ち切った近似 $f_m(x) = \sum_{i=1}^m \sqrt{\lambda_i}\xi_i\phi_i(x)$ は、$m$ 項で表せる関数の中で平均二乗誤差を最小にする最良近似になります(これがPCAとの類似です)。

左の図は、RBFカーネルから生成した一つのサンプル関数(黒線、全項)を、KL展開の上位 $2, 5, 20$ 項で打ち切った近似と重ねたものです。2項では大まかな形しか捉えられませんが、項数を増やすと急速に真のサンプルへ収束し、20項でほぼ一致します。右の図は累積分散寄与率で、わずか十数項で全分散の99%を説明できることを示します。固有値が急減衰するRBFでは、無限次元の関数が実質的に少数の自由度で表せることが読み取れます。
KL展開は連続な積分作用素の固有関数を使いますが、実際の計算では入力を有限個の点に離散化し、共分散行列 $\bm{K}$ そのものを固有値分解します。これは行列版のKL展開(PCA)にあたり、固有ベクトルがKL基底、固有値が各基底の分散になります。

上段は共分散行列 $\bm{K} = \Phi\Lambda\Phi^T$ の固有分解で、固有値が急速に減衰し(中央)、固有ベクトル(右)が低次から順に振動を増やすKL基底になっていることを示します。下段は、一つのサンプル関数を上位 $2, 5, 20$ 個の主成分(固有ベクトル)だけで再構成したもので、20個もあれば元のサンプルがほぼ完全に復元できます。連続版のKL展開(前の図)と離散版の主成分再構成(この図)が、同じ「固有関数で展開する」という考えの表と裏であることが読み取れます。
KL展開は理論上きれいですが、ここで一つ、初学者を戸惑わせる微妙な事実があります。「GPのサンプル関数はRKHSの要素なのか」という問いです。直感的には「はい」と言いたくなりますが、答えは「いいえ(測度1で入らない)」です。次節でこの逆説を解きほぐします。
GPサンプルとRKHSの微妙な関係
ここまで、GPの事後平均がRKHSの要素であり、RKHSノルム正則化の解であることを見てきました。ではごく自然に、「GPからサンプルされる関数も、当然そのRKHSの中に入っているのだろう」と思うでしょう。ところが、これは正しくありません。むしろ、GPのサンプル関数は確率1で(測度1で)RKHSの外にあります。これは関数空間論における有名な逆説の一つです。
なぜサンプルはRKHSに入らないのか
KL展開でこの逆説の正体が見えます。サンプル $f = \sum_i \sqrt{\lambda_i}\xi_i\phi_i$ がRKHSの要素であるためには、RKHSノルムが有限でなければなりません。固有関数で展開した関数 $f = \sum_i a_i\phi_i$(ここで $a_i = \sqrt{\lambda_i}\xi_i$)のRKHSノルムは、先に見たとおり
$$ \|f\|_{\mathcal{H}}^2 = \sum_{i=1}^{\infty}\frac{a_i^2}{\lambda_i} = \sum_{i=1}^{\infty}\frac{(\sqrt{\lambda_i}\,\xi_i)^2}{\lambda_i} = \sum_{i=1}^{\infty}\xi_i^2 $$
です。ここで決定的な相殺が起きました。分子の $\lambda_i$ と分母の $\lambda_i$ がきれいに約分され、固有値がすべて消えて $\sum_i \xi_i^2$ だけが残るのです。ところが $\xi_i$ は独立な標準正規変数なので、$\mathbb{E}[\xi_i^2] = 1$。したがって
$$ \mathbb{E}\big[\|f\|_{\mathcal{H}}^2\big] = \sum_{i=1}^{\infty}\mathbb{E}[\xi_i^2] = \sum_{i=1}^{\infty} 1 = \infty $$
となり、ノルムの期待値が発散します。実際、大数の法則により $\sum_{i=1}^m \xi_i^2 \approx m \to \infty$ なので、ノルムは確率1で無限大です。つまりGPサンプルは確率1でRKHSに属しません。
直感的な理解
この逆説の直感はこうです。RKHSノルムは「高周波成分を固有値の減衰より速く減衰させる」関数だけを許容する、非常に厳しい滑らかさの基準でした。一方、GPサンプルは各固有モードに「ちょうど $\sqrt{\lambda_i}$ 倍の」ランダムな揺らぎを乗せます。この揺らぎは、RKHSが要求する減衰よりわずかに「重い」のです——ちょうど境界線上で、ノルムが発散するギリギリのところに乗ってきます。
例えるなら、RKHSは「お行儀の良い、なめらかすぎる関数だけが入れる高級クラブ」です。GPの事前分布はこのクラブを「典型的な滑らかさの尺度」として参照していますが、実際にサンプルされる関数は、クラブの基準よりほんの少しだけ粗く、入会資格を満たしません。GPサンプルが住むのは、RKHSより少しだけ大きい空間(より弱いノルムのソボレフ空間など)になります。
この事実が示唆すること
この微妙な事実は、実用上も理論上も重要な含意を持ちます。第一に、GPの事後平均(RKHSに入る滑らかな関数)と、GPのサンプル(RKHSに入らない粗い関数)は別物だということです。事後平均はあくまで「平均的な滑らかな推定」であり、不確実性を表現する個々のサンプルパスはそれより粗いのです。第二に、カーネルリッジ回帰やSVMが扱う関数(RKHSの要素)と、ガウス過程が生成する関数(RKHSの外)は、同じカーネルから出発していても住む空間が違う、ということです。「カーネルが同じなら関数空間も同じ」という素朴な直感は、ここでは通用しません。
理論はここまでです。最後に、これまで証明・主張してきたこと——固有関数展開、KL展開、GP=KRRの一致——をPythonで実際に数値確認してみましょう。
Pythonでの実装:固有関数展開の数値確認
理論で導いた三つの柱——(1) Mercer固有関数による展開、(2) KL展開による関数のサンプリング、(3) GP事後平均とKRRの一致——を、すべてNumPyだけで数値的に確かめます。「証明した式が本当に数値で成り立つか」を自分の目で確認するのが目的です。
共通の準備とカーネル定義
まず、本記事で使うRBFカーネルと、積分作用素の固有値問題をNyström近似で解く関数を用意します。
import numpy as np
np.random.seed(42)
def rbf_kernel(X1, X2, ell=1.0, sigma=1.0):
"""RBF(ガウス)カーネル k(x,x') = sigma^2 exp(-(x-x')^2 / 2 ell^2)"""
d2 = (X1[:, None] - X2[None, :]) ** 2
return sigma ** 2 * np.exp(-0.5 * d2 / ell ** 2)
def mercer_eigen(xs, ell, sigma):
"""一様測度上の積分作用素の固有値・固有関数をNystrom近似で求める。
戻り値: 降順固有値 vals, 固有関数の標本値 phi[:, i] = phi_i(xs)"""
n = len(xs)
w = (xs[-1] - xs[0]) / n # 一様測度の重み(Δx)
K = rbf_kernel(xs, xs, ell, sigma)
vals, vecs = np.linalg.eigh(w * K) # (w K) v = lambda v
idx = np.argsort(vals)[::-1] # 降順に並べ替え
vals = np.clip(vals[idx], 0, None) # 数値誤差で負になる微小値をクリップ
phi = vecs[:, idx] / np.sqrt(w) # L2(p)正規化された固有関数
return vals, phi
mercer_eigen は、積分作用素 $T_k$ の固有値問題を、重み付きグラム行列 $w\bm{K}$ の固有値問題で近似します。w は離散化の刻み幅(一様測度の重み)で、これを掛けることで「和」が「積分」を近似します。固有ベクトルを $\sqrt{w}$ で割っているのは、$L^2$ 内積 $\int \phi_i\phi_j\, p\,\mathrm{d}x \approx w\sum_k \phi_i(x_k)\phi_j(x_k) = \delta_{ij}$ を満たすように正規化するためです。
Mercer展開でカーネルを再構成
Mercerの定理 $k(x,x’) = \sum_i \lambda_i\phi_i(x)\phi_i(x’)$ が本当に成り立つか、上位項の和で元のカーネルをどこまで再現できるかを測ります。
import numpy as np
# 入力グリッドと固有分解
xs = np.linspace(-3, 3, 300)
ell, sigma = 0.7, 1.0
vals, phi = mercer_eigen(xs, ell, sigma)
K_true = rbf_kernel(xs, xs, ell, sigma)
# 上位 m 項での再構成と相対誤差
for m in [1, 3, 5, 10, 20]:
K_m = (phi[:, :m] * vals[:m]) @ phi[:, :m].T # Σ λ_i φ_i φ_i^T
rel_err = np.linalg.norm(K_m - K_true) / np.linalg.norm(K_true)
print(f"上位 {m:2d} 項: 相対再構成誤差 = {rel_err:.3e}")
このコードを実行すると、項数 $m$ を増やすにつれて相対誤差が急速に小さくなり、$m=10$ で $10^{-3}$ オーダー、$m=20$ ではほぼ機械精度に達します。出力例は次のようになります。
上位 1 項: 相対再構成誤差 = 7.760e-01
上位 3 項: 相対再構成誤差 = 3.684e-01
上位 5 項: 相対再構成誤差 = 1.251e-01
上位 10 項: 相対再構成誤差 = 2.086e-03
上位 20 項: 相対再構成誤差 = 5.258e-09
固有値が超指数的に減衰するRBFカーネルでは、わずか10〜20個の固有関数で無限級数がほぼ完全に再現できることが読み取れます。Mercerの定理が主張する「固有関数展開による収束」が、数値的にも明確に確認できました。理論で見た「少数の固有関数が支配的」という性質が、この急速な誤差減少として現れています。
Karhunen-Loève展開でサンプルを作る
次に、KL展開 $f(x) = \sum_i \sqrt{\lambda_i}\,\xi_i\,\phi_i(x)$ で関数をサンプリングし、Cholesky分解による通常のGPサンプリングと統計的に一致するかを確かめます。
import numpy as np
xs = np.linspace(-3, 3, 300)
vals, phi = mercer_eigen(xs, ell=0.7, sigma=1.0)
# KL展開で多数のサンプルを生成し、標本共分散を作る
rng = np.random.default_rng(0)
n_samples = 4000
m = 60 # 打ち切り項数
Xi = rng.standard_normal((m, n_samples)) # ξ_i ~ N(0,1)
F = phi[:, :m] @ (np.sqrt(vals[:m])[:, None] * Xi) # f = Σ √λ_i ξ_i φ_i
# 標本共分散と真のカーネルを比較
K_true = rbf_kernel(xs, xs, ell=0.7, sigma=1.0)
K_emp = (F @ F.T) / n_samples
rel_err = np.linalg.norm(K_emp - K_true) / np.linalg.norm(K_true)
print(f"KLサンプルの標本共分散 vs 真のカーネル: 相対誤差 = {rel_err:.3e}")
print(f"対角成分(分散)の平均: 標本={np.mean(np.diag(K_emp)):.3f}, 真値=1.0")
実行すると、4000本のKLサンプルから推定した標本共分散行列が、真のRBFカーネルと数%以内の相対誤差で一致します(サンプル数を増やせばさらに縮みます)。
KLサンプルの標本共分散 vs 真のカーネル: 相対誤差 = 3.187e-02
対角成分(分散)の平均: 標本=0.996, 真値=1.0
これは、KL展開 $f = \sum_i \sqrt{\lambda_i}\xi_i\phi_i$ が確かに正しい共分散 $k(x,x’)$ を持つガウス過程を生成していることの数値的証拠です。理論で示した共分散の計算 $\mathrm{Cov}(f(x),f(x’)) = \sum_i \lambda_i\phi_i(x)\phi_i(x’) = k(x,x’)$ が、有限サンプルでも近似的に成り立っていることが確認できました。
サンプルパスの滑らかさとカーネルの関係
カーネルの固有値減衰が、サンプル関数の滑らかさをどう決めるかを可視化します。RBF、Matérn $\nu=3/2$、OU(指数)の3つで比較します。
import numpy as np
import matplotlib, matplotlib.pyplot as plt
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
plt.rcParams["font.family"] = cand
break
plt.rcParams["axes.unicode_minus"] = False
def matern32(X1, X2, ell=1.0):
d = np.abs(X1[:, None] - X2[None, :]) / ell
return (1 + np.sqrt(3) * d) * np.exp(-np.sqrt(3) * d)
def ou(X1, X2, ell=1.0):
return np.exp(-np.abs(X1[:, None] - X2[None, :]) / ell)
rng = np.random.default_rng(7)
xs = np.linspace(0, 5, 400)
kernels = [("RBF(無限回微分可能)", rbf_kernel(xs, xs, ell=0.6)),
("Matern ν=3/2(1回微分可能)", matern32(xs, xs, ell=0.6)),
("OU(連続だが微分不可)", ou(xs, xs, ell=0.6))]
fig, axes = plt.subplots(1, 3, figsize=(16, 4.5))
for ax, (name, K) in zip(axes, kernels):
L = np.linalg.cholesky(K + 1e-8 * np.eye(len(xs)))
for _ in range(4):
ax.plot(xs, L @ rng.standard_normal(len(xs)), alpha=0.7)
ax.set_title(name); ax.set_xlabel("$x$"); ax.set_ylabel("$f(x)$")
ax.grid(alpha=0.3)
plt.tight_layout(); plt.savefig("sample_smoothness.png", dpi=130); plt.show()
このコードで生成したサンプルパスを比較すると、カーネルの滑らかさがそのまま関数の滑らかさに反映されることがわかります。

RBF(左)のサンプルはどこまでも滑らかで、何度でも微分できそうな曲線です。Matérn $\nu=3/2$(中央)はやや角張り、1回だけ微分可能な程度の粗さを持ちます。OU(右)はギザギザで、連続ではあるものの微分できない(ブラウン運動に似た)軌道を描きます。前節で見た固有値減衰の違い——RBFは超指数的、Matérnは多項式的、OUはさらに緩やか——が、このサンプルパスの滑らかさの差として目に見える形で現れています。
GP事後平均とKRRの一致を確認
最後に、本記事の核心の一つ——GP事後平均とカーネルリッジ回帰が $\lambda=\sigma_n^2$ で一致すること——を数値で確かめます。
import numpy as np
rng = np.random.default_rng(42)
Xtr = np.sort(rng.uniform(-4, 4, 12))
ytr = np.sin(Xtr) + 0.15 * rng.standard_normal(12)
Xte = np.linspace(-5.5, 5.5, 300)
ell, sigma, noise = 1.0, 1.0, 0.15 # noise = sigma_n(標準偏差)
K = rbf_kernel(Xtr, Xtr, ell, sigma)
Ks = rbf_kernel(Xte, Xtr, ell, sigma) # k_*(テスト×訓練)
# GP事後平均: k_*^T (K + sigma_n^2 I)^-1 y
mu_gp = Ks @ np.linalg.solve(K + noise**2 * np.eye(len(Xtr)), ytr)
# カーネルリッジ回帰: 正則化 λ = sigma_n^2
lam = noise**2
mu_krr = Ks @ np.linalg.solve(K + lam * np.eye(len(Xtr)), ytr)
print(f"GP事後平均とKRR予測の最大差 = {np.max(np.abs(mu_gp - mu_krr)):.3e}")
実行結果は次のとおりです。
GP事後平均とKRR予測の最大差 = 0.000e+00
最大差は厳密にゼロです。これは当然で、$\lambda = \sigma_n^2$ と置けば両者は文字どおり同じ線形方程式 $(\bm{K}+\sigma_n^2\bm{I})\bm{\alpha} = \bm{y}$ を解いているからです。理論で導いた「representer定理 → カーネルリッジ回帰 → GP事後平均」という一連の橋渡しが、コード上でも一本の式に集約されていることが確認できました。GPは確率モデルの言葉で、KRRは正則化付き最適化の言葉で、まったく同じ予測関数を別々の入り口から導いていたのです。
まとめ
本記事では、ガウス過程を「関数上の確率分布」として関数解析の立場から厳密に理解し、Mercerの定理・RKHS・representer定理を一本の線でつなぎました。
- 二つのビューの双対性: weight-space view(ベイズ線形回帰、重みに事前分布)と function-space view(関数に直接GP)は、$k(\bm{x},\bm{x}’)=\bm{\phi}(\bm{x})^T\Sigma_p\bm{\phi}(\bm{x}’)$ という共分散関数で結ばれた同じモデルである。
- Mercerの定理: 連続な正定値カーネルは固有関数展開 $k(x,x’)=\sum_i\lambda_i\phi_i(x)\phi_i(x’)$ を持ち、これがカーネルを無限次元の内積として表すこと(カーネルトリック)を正当化する。固有値の減衰がカーネルの滑らかさを決める。
- RKHSと再生性: カーネルが張る関数空間RKHSでは、再生性 $f(\bm{x})=\langle f, k(\bm{x},\cdot)\rangle_{\mathcal{H}}$ が成り立つ。RKHSノルムは $\|f\|^2=\sum_i a_i^2/\lambda_i$ で、高周波成分にペナルティを課す滑らかさの尺度になる。
- representer定理: RKHS上の正則化問題の解は、データ点の再生核の有限線形結合 $f^\star=\sum_i\alpha_i k(\bm{x}_i,\cdot)$ で書ける。無限次元の問題が $N$ 次元に縮約される。
- GP事後平均=カーネルリッジ回帰: 二乗誤差損失のもとで、KRRの解 $(\bm{K}+\lambda\bm{I})^{-1}\bm{y}$ はGPの事後平均と $\lambda=\sigma_n^2$ で完全に一致する。GPは加えて事後分散(不確実性)も返す。
- Karhunen-Loève展開: GPサンプルは $f(x)=\sum_i\sqrt{\lambda_i}\xi_i\phi_i(x)$($\xi_i\sim\mathcal{N}(0,1)$)と展開でき、確率過程版のPCAになる。
- GPサンプルとRKHSの微妙な関係: GPサンプルのRKHSノルムは $\sum_i\xi_i^2=\infty$ となり、サンプルは確率1でRKHSに属さない。事後平均(RKHS内)とサンプル(RKHS外)は別物である。
これらの理論は、ガウス過程を単なる「便利な回帰の道具」から「関数空間上の確率論」へと押し上げます。カーネルを選ぶことは固有値の減衰、ひいては関数の滑らかさを選ぶこと。正則化はガウス過程の事前分布の言い換え。そして無限次元の最適化が有限次元に落ちるからこそ、私たちは計算機でガウス過程を扱えるのです。
次のステップとして、以下の記事も参考にしてください。