平面に散らばった赤と青の点を、1本の直線できれいに分けたい——機械学習の入門で最初に出会う「線形分類」の問題です。ところが現実のデータはそんなに親切ではありません。赤い点が中心にかたまり、青い点がそれを取り囲むドーナツ状に並んでいたら、どんな直線を引いても分離できません。同心円という構造そのものが、線形では扱えない非線形性を持っているからです。
ここで素朴な発想が湧きます。「2次元では分けられないなら、3次元目を足してみたらどうか」。たとえば各点に $z = x^2 + y^2$ という新しい座標を付け加えれば、内側の点は $z$ が小さく、外側の点は $z$ が大きい。3次元空間で見ると、赤と青は高さの違う2つの層に分かれ、水平面1枚で分離できてしまいます。「線形分離できないなら高次元に飛ばせばよい」——これこそがカーネル法の原点です。
しかしこのアイデアには重大な落とし穴があります。高次元写像 $\bm{\Phi}(\bm{x})$ を陽に計算すると、次元爆発を起こすのです。$d$ 次元入力に対して $p$ 次多項式特徴を全部展開すれば $O(d^p)$ 次元、ガウスカーネルに至っては無限次元になり、$\bm{\Phi}$ をそもそも書き下せないことすらあります。
ここで魔法のように働くのがカーネルトリックです。SVM、リッジ回帰、PCA、ガウス過程など多くの機械学習アルゴリズムは、データを「内積」の形でしか触りません。であれば、$\bm{\Phi}(\bm{x})^T \bm{\Phi}(\bm{y})$ という内積を計算できる関数 $k(\bm{x}, \bm{y})$ さえ用意できれば、$\bm{\Phi}$ を一度も書かずに高次元空間での計算が完結します。これがカーネルトリックの本質です。
この発想は、SVMで非線形分類器を作る場面、ガウス過程回帰で滑らかな関数事前分布を構成する場面、kernel PCAで非線形多様体を可視化する場面など、現代の機械学習のあらゆる場所に現れます。本記事では直感、Mercerの定理、再生核ヒルベルト空間(RKHS)といった数学的な土台、SVM・ガウス過程との関係、scikit-learnによる比較実装までを体系的に解きほぐしていきます。
本記事の内容
- 非線形データを高次元写像で線形分離する直感とカーネルトリックの本質
- カーネル関数の定義・正定値性・Mercerの定理
- 線形・多項式・RBF・シグモイド・Matérnなど代表的カーネルの比較
- SVMの双対形式におけるカーネルトリックの導出
- ガウス過程・kernel PCA・kernel ridge regressionへの応用
- 再生核ヒルベルト空間(RKHS)の概要と再生性
- scikit-learn実装によるSVM・GP・kernel PCAの比較と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
直感 — 高次元写像と内積
線形分離不可能なデータをどう扱うか
冒頭で触れたドーナツ状のデータをもう一度考えてみましょう。2次元平面 $(x_1, x_2)$ 上で、原点近くに赤い点、半径 $r$ 程度の円周上に青い点が並んでいるとします。線形分類器は $\bm{w}^T \bm{x} + b = 0$ という直線(一般には超平面)でデータを分けますが、円と円の中身を直線で区切ることは原理的に不可能です。
そこで、各点に新しい特徴 $z = x_1^2 + x_2^2$ を加え、3次元空間 $(x_1, x_2, z)$ へ写像します。元のデータ点 $\bm{x} = (x_1, x_2)$ は、
$$ \bm{\Phi}(\bm{x}) = (x_1, x_2, x_1^2 + x_2^2) $$
という3次元ベクトルに変換されます。すると赤い点は $z$ が小さく、青い点は $z$ が大きいので、$z = c$ という水平面1枚で完璧に分離できます。元の2次元空間に戻して見ると、この水平面は半径 $\sqrt{c}$ の円に対応します。線形分類器を高次元で適用した結果、元の空間では「円形の決定境界」が現れたのです。

このように、元の空間で線形分離できないデータでも、適切な非線形写像で高次元空間に持ち上げれば線形分離できる——これがカーネル法の出発点です。元のデータ空間を $\Omega$、写像先の高次元空間を特徴空間 $\mathcal{H}$、写像 $\bm{\Phi}: \Omega \to \mathcal{H}$ を特徴写像と呼びます。
写像を明示的に作るのが大変な理由
しかしここで現実的な問題が立ちはだかります。「ちょうどよい $\bm{\Phi}$ をどう設計するか」「設計できたとして、計算量が爆発しないか」という二つの問題です。
たとえば $d$ 次元入力に対して、すべての次数 $\le p$ の単項式を並べた特徴写像を考えると、その次元は $\binom{d+p}{p}$ になります。$d = 100, p = 5$ なら $\binom{105}{5} \approx 9.6 \times 10^7$ 次元。各データ点ごとにこれだけの特徴量を計算してメモリに載せるのは現実的ではありません。さらに $p$ を無限大に伸ばしたい——たとえば「あらゆる滑らかさを表現できる無限次元の特徴空間」を使いたい——場合、そもそも $\bm{\Phi}$ を有限次元のベクトルとして書き下せません。
ここで救世主として登場するのがカーネルトリックです。「アルゴリズムが特徴ベクトルを直接使わず、特徴ベクトル同士の内積だけを使う」のであれば、内積を直接計算する関数 $k(\bm{x}, \bm{y}) = \bm{\Phi}(\bm{x})^T \bm{\Phi}(\bm{y})$ さえあれば $\bm{\Phi}$ そのものは不要になる、というアイデアです。
内積だけで何ができるかの予告
ピンと来にくいかもしれませんが、実は機械学習の主要アルゴリズムの多くは「データの内積」だけで定式化できます。たとえば線形SVMの双対問題は $\sum_i \alpha_i – \frac{1}{2}\sum_{i,j} \alpha_i \alpha_j y_i y_j \bm{x}_i^T \bm{x}_j$ を最大化する問題で、$\bm{x}_i^T \bm{x}_j$ という内積だけが現れます。同様にリッジ回帰、PCA、k-meansの一部、ガウス過程回帰も、データへのアクセスは内積(あるいは距離 $\|\bm{x}_i – \bm{x}_j\|^2 = \bm{x}_i^T\bm{x}_i – 2\bm{x}_i^T\bm{x}_j + \bm{x}_j^T\bm{x}_j$ として内積に帰着できるもの)に閉じています。
これらの内積を $k(\bm{x}_i, \bm{x}_j)$ に置き換えるだけで、自動的に「高次元特徴空間での線形アルゴリズム」が手に入る——これがカーネル法の威力です。次のセクションでは、この $k$ がどんな関数でもよいのか、内積として成り立つには何が必要か、という数学的な土台を見ていきます。
カーネル関数の定義と性質
カーネル関数の定義
ここで改めて、カーネル関数を厳密に定義します。集合 $\Omega$ 上の関数 $k: \Omega \times \Omega \to \mathbb{R}$ がカーネル関数であるとは、ある特徴空間 $\mathcal{H}$ と写像 $\bm{\Phi}: \Omega \to \mathcal{H}$ が存在して、
$$ k(\bm{x}, \bm{y}) = \langle \bm{\Phi}(\bm{x}), \bm{\Phi}(\bm{y}) \rangle_{\mathcal{H}} $$
と書けることを言います。ここで $\langle \cdot, \cdot \rangle_{\mathcal{H}}$ は $\mathcal{H}$ 上の内積です。$\mathcal{H}$ が $\mathbb{R}^m$ なら通常のドット積、無限次元のヒルベルト空間なら積分による内積など、空間に応じた内積を使います。
内積から自然に導かれる性質として、カーネルは対称性を満たします。
$$ k(\bm{x}, \bm{y}) = \langle \bm{\Phi}(\bm{x}), \bm{\Phi}(\bm{y}) \rangle = \langle \bm{\Phi}(\bm{y}), \bm{\Phi}(\bm{x}) \rangle = k(\bm{y}, \bm{x}) $$
つまり引数を入れ替えても値が変わりません。
正定値性とグラム行列
もう一つ重要な性質が正定値性です。任意のデータ点集合 $\bm{x}_1, \dots, \bm{x}_n \in \Omega$ に対して、
$$ K_{ij} = k(\bm{x}_i, \bm{x}_j), \quad i, j = 1, \dots, n $$
で作られる $n \times n$ 行列 $\bm{K}$ をグラム行列(カーネル行列)と呼びます。$k$ がある特徴写像の内積で表せるとき、任意の係数ベクトル $\bm{c} = (c_1, \dots, c_n)^T$ に対して
$$ \bm{c}^T \bm{K} \bm{c} = \sum_{i,j} c_i c_j k(\bm{x}_i, \bm{x}_j) = \sum_{i,j} c_i c_j \langle \bm{\Phi}(\bm{x}_i), \bm{\Phi}(\bm{x}_j) \rangle $$
が成り立ちます。内積の双線形性により
$$ \bm{c}^T \bm{K} \bm{c} = \left\langle \sum_i c_i \bm{\Phi}(\bm{x}_i), \sum_j c_j \bm{\Phi}(\bm{x}_j) \right\rangle = \left\| \sum_i c_i \bm{\Phi}(\bm{x}_i) \right\|_{\mathcal{H}}^2 \ge 0 $$
となるので、$\bm{K}$ は半正定値(任意の $\bm{c}$ に対して $\bm{c}^T\bm{K}\bm{c} \ge 0$)です。つまり「内積から作ったカーネルは必ず半正定値なグラム行列を生成する」ことが必要条件として導かれます。

Mercerの定理
驚くべきことに、この逆も成り立ちます。Mercerの定理は、対称かつ任意のデータ点集合に対するグラム行列が半正定値になる関数 $k$ は、必ずある内積空間における内積として表現できることを保証します。
正確には、コンパクト集合上の連続な対称半正定値カーネル $k$ は、積分作用素 $T_k f(\bm{x}) = \int k(\bm{x}, \bm{y}) f(\bm{y}) d\bm{y}$ の固有値 $\lambda_i \ge 0$ と固有関数 $\psi_i$ により
$$ k(\bm{x}, \bm{y}) = \sum_{i=1}^{\infty} \lambda_i \psi_i(\bm{x}) \psi_i(\bm{y}) $$
と展開できます。このとき $\bm{\Phi}(\bm{x}) = (\sqrt{\lambda_1}\psi_1(\bm{x}), \sqrt{\lambda_2}\psi_2(\bm{x}), \dots)$ と置けば、$k(\bm{x}, \bm{y}) = \bm{\Phi}(\bm{x})^T \bm{\Phi}(\bm{y})$ がきれいに成り立ちます。
実用上の意味は明快です——「対称で半正定値な関数なら、それは必ず何らかの特徴空間の内積として解釈できるカーネル関数である」。Mercerの定理のおかげで、特徴写像を一切考えずに、カーネル関数の半正定値性だけをチェックすれば安心して使えるのです。
カーネルの代数的性質
実用上重要なのは、半正定値カーネル同士は組み合わせても半正定値カーネルになるという性質です。$k_1, k_2$ をカーネル、$a > 0$ を定数とすると、$a k_1$、$k_1 + k_2$、$k_1 \cdot k_2$、$\exp(k_1)$ などはすべてカーネルになります。この性質のおかげで、ガウス過程では「滑らかさ + 周期性 + トレンド」のような構造をカーネルの加法・乗法で表現する設計(カーネル工学)が広く行われています。
これでカーネル関数の理論的な土台が整いました。次に、実際にどんなカーネルが使われているかを具体的に見ていきましょう。
代表的なカーネル関数
線形カーネル
最もシンプルなカーネルは、特徴写像を恒等写像 $\bm{\Phi}(\bm{x}) = \bm{x}$ とした線形カーネル $k(\bm{x}, \bm{y}) = \bm{x}^T \bm{y}$ です。通常の内積そのもので、カーネル法の恩恵を受けない「素のアルゴリズム」と等価。線形分離可能なデータでは計算コストが最も安く過学習も起こしにくいので第一選択肢になります。テキスト分類のように高次元疎ベクトル(TF-IDF)を扱う問題では強力なベースラインです。
多項式カーネル
$$ k(\bm{x}, \bm{y}) = (\bm{x}^T \bm{y} + c)^p $$
ここで $p$ は次数、$c \ge 0$ はバイアス項です。$p = 2, \bm{x}, \bm{y} \in \mathbb{R}^2$ で展開すると、$(x_1 y_1 + x_2 y_2 + c)^2$ から $\bm{\Phi}(\bm{x}) = (x_1^2, x_2^2, \sqrt{2} x_1 x_2, \sqrt{2c} x_1, \sqrt{2c} x_2, c)$ という6次元特徴空間での内積に対応することが分かります。次数 $p$ を上げると交差項を含むあらゆる単項式が登場し、特徴空間の次元は急激に膨らみます。多項式カーネルは画像処理や自然言語処理の一部で使われますが、$p$ を大きくしすぎるとカーネル値が爆発するため注意が必要です。
ガウスカーネル(RBFカーネル)
最も広く使われ、デフォルトの選択肢になることが多いのがガウスカーネル(RBFカーネル、Radial Basis Function kernel)です。
$$ k(\bm{x}, \bm{y}) = \exp\left( -\gamma \|\bm{x} – \bm{y}\|^2 \right), \quad \gamma = \frac{1}{2\sigma^2} $$
$\sigma$(あるいは $\gamma$)がバンド幅で、データ点同士の「類似度を感じる距離尺度」を決めます。$\sigma$ が大きい($\gamma$ が小さい)と遠くの点まで類似と見なして滑らかな決定境界になり、逆に小さいと局所的にしか類似度を感じず過学習しやすくなります。
ガウスカーネルが特別なのは、対応する特徴空間が無限次元になる点です。テイラー展開すると $\exp(-\gamma\|\bm{x}-\bm{y}\|^2)$ は $(\bm{x}^T\bm{y})^k$ の無限級数になり、あらゆる次数の多項式特徴を無限に並べた空間に対応しています。にもかかわらず、計算には1個の指数関数だけで済む——カーネルトリックの威力を最も鮮明に体感できる例です。
シグモイドカーネル
$$ k(\bm{x}, \bm{y}) = \tanh(\alpha \bm{x}^T \bm{y} + c) $$
ニューラルネットの活性化関数と同じ形をしていることから「ニューラルカーネル」とも呼ばれます。厳密にはすべてのパラメータで半正定値性が保証されない領域もありますが、経験的に機能する場合があり伝統的に SVM の教科書に登場します。
Matérnカーネル
ガウス過程の文脈でよく使われるのがMatérnカーネルで、第2種変形ベッセル関数 $K_{\nu}$、滑らかさパラメータ $\nu$、長さスケール $\ell$ を用いて
$$ k(\bm{x}, \bm{y}) = \frac{2^{1-\nu}}{\Gamma(\nu)} \left( \sqrt{2\nu} \frac{\|\bm{x} – \bm{y}\|}{\ell} \right)^{\nu} K_{\nu}\left( \sqrt{2\nu} \frac{\|\bm{x} – \bm{y}\|}{\ell} \right) $$
と書かれます。$\nu \to \infty$ で RBF に一致し、$\nu = 1/2$ で指数カーネル(オルンシュタイン-ウーレンベック過程の共分散)に一致します。$\nu = 3/2, 5/2$ はRBFほど滑らかすぎないモデリングが必要な物理現象や地理データで重宝します。
周期カーネル
時系列の周期性をモデル化したいときは周期カーネル $k(\bm{x}, \bm{y}) = \exp\left( -2 \sin^2\left( \pi \|\bm{x} – \bm{y}\| / p \right) / \ell^2 \right)$ を使います。$p$ が周期、$\ell$ が滑らかさで、気温の年周期や太陽活動の11年周期のような周期構造のガウス過程モデリングに使われます。
カーネル工学ではこれらを組み合わせて「RBF × 周期カーネル」「線形 + RBF」のような複雑な構造を表現できます。

次のセクションでは、これらのカーネルがSVMという代表的アルゴリズムでどう使われるかを見ていきます。
SVMでのカーネルトリック
SVMの双対形式
サポートベクターマシン(SVM)は、カーネルトリックが最もきれいに働くアルゴリズムです。マージン最大化を目的とした主問題は、
$$ \min_{\bm{w}, b, \xi} \frac{1}{2}\|\bm{w}\|^2 + C \sum_i \xi_i $$
$$ \text{s.t.} \quad y_i (\bm{w}^T \bm{x}_i + b) \ge 1 – \xi_i, \quad \xi_i \ge 0 $$
という最適化問題でした。これにラグランジュ双対をとると(サポートベクターマシンの導出参照)、
$$ \max_{\bm{\alpha}} \sum_{i=1}^n \alpha_i – \frac{1}{2}\sum_{i,j} \alpha_i \alpha_j y_i y_j \bm{x}_i^T \bm{x}_j $$
$$ \text{s.t.} \quad 0 \le \alpha_i \le C, \quad \sum_i \alpha_i y_i = 0 $$
という双対問題に変形できます。注目すべきは、データ $\bm{x}_i$ が登場する箇所が内積 $\bm{x}_i^T \bm{x}_j$ だけだということです。
カーネルトリックの適用
ここでカーネルトリックを発動します。$\bm{x}_i^T \bm{x}_j$ を $k(\bm{x}_i, \bm{x}_j)$ に置き換えるだけで、自動的に特徴空間 $\mathcal{H}$ での線形SVMになります。
$$ \max_{\bm{\alpha}} \sum_i \alpha_i – \frac{1}{2}\sum_{i,j} \alpha_i \alpha_j y_i y_j k(\bm{x}_i, \bm{x}_j) $$
$\bm{\Phi}(\bm{x})$ がたとえ無限次元でも、計算は $n \times n$ のカーネル行列 $K_{ij} = k(\bm{x}_i, \bm{x}_j)$ だけで完結します。$\bm{w} = \sum_i \alpha_i y_i \bm{\Phi}(\bm{x}_i)$ は無限次元になるかもしれませんが、それを陽に保持する必要はまったくありません。
新しい点 $\bm{x}_*$ の予測は、
$$ f(\bm{x}_*) = \bm{w}^T \bm{\Phi}(\bm{x}_*) + b = \sum_i \alpha_i y_i \bm{\Phi}(\bm{x}_i)^T \bm{\Phi}(\bm{x}_*) + b = \sum_i \alpha_i y_i k(\bm{x}_i, \bm{x}_*) + b $$
となり、ここでも $\bm{\Phi}$ を陽に書かずに $k$ だけで計算できます。$\alpha_i \ne 0$ となる訓練点がサポートベクターで、予測時の計算量はサポートベクターの数に比例します。

表現定理 — なぜ予測が訓練点の重ね合わせで書けるのか
「予測が $f(\bm{x}_*) = \sum_i \alpha_i y_i k(\bm{x}_i, \bm{x}_*) + b$ の形で書ける」という事実は、SVMに限らずカーネル法全般に成り立つ普遍的な性質で、表現定理(Representer theorem)として知られています。
正則化付き経験リスク最小化問題
$$ \min_{f \in \mathcal{H}} \sum_{i=1}^n L(y_i, f(\bm{x}_i)) + \lambda \|f\|_{\mathcal{H}}^2 $$
の解 $f^*$ は、必ず
$$ f^*(\bm{x}) = \sum_{i=1}^n c_i k(\bm{x}_i, \bm{x}) $$
の形で書ける、というのが表現定理の主張です($L$ は損失関数、$\|\cdot\|_{\mathcal{H}}$ はRKHSのノルム)。ヒルベルト空間という無限次元空間で関数を探していたのに、答えは「訓練データに対応するカーネルの線形結合」という有限次元の形に落ちる——これがカーネル法が計算可能になる理論的な根拠です。
カーネル選択のガイドライン
実務では、まずRBFカーネルから始めるのが定石です。理由は、無限次元という強い表現力を持ちながら、ハイパーパラメータが $\gamma$ と正則化係数 $C$ の2つだけと取り回しやすいからです。グリッドサーチや交差検証で $\gamma, C$ を選び、決定境界の滑らかさを調整します。
- $\gamma$ 大 → 局所的、過学習しやすい、複雑な境界
- $\gamma$ 小 → 大域的、滑らか、線形カーネルに近い


データに既知の構造(多項式関係、周期性、テキスト)がある場合は、対応する専用カーネルを選ぶことで効率が上がります。次のセクションでは、SVMとは別の文脈でカーネルが活躍する場面——ガウス過程——を見ていきます。
ガウス過程との関係 — カーネルは共分散関数
ガウス過程の定義
ガウス過程(Gaussian Process, GP)は「関数の上の確率分布」と呼ばれます。入力空間 $\Omega$ 上の確率過程 $f(\bm{x})$ が、任意の有限個の入力点 $\bm{x}_1, \dots, \bm{x}_n$ に対して、$\bm{f} = (f(\bm{x}_1), \dots, f(\bm{x}_n))^T$ が多変量正規分布
$$ \bm{f} \sim \mathcal{N}(\bm{\mu}, \bm{K}) $$
に従うとき、$f$ はガウス過程であると言います。ここで平均ベクトル $\mu_i = m(\bm{x}_i)$、共分散行列 $K_{ij} = k(\bm{x}_i, \bm{x}_j)$ が、それぞれ平均関数 $m$ と共分散関数 $k$ から決まります。
ここで注目してほしいのは、共分散関数 $k$ こそがカーネル関数そのものだということです。ガウス過程の世界では、カーネルは「2点の出力 $f(\bm{x}), f(\bm{y})$ がどれくらい連動して動くか」を表します。$k(\bm{x}, \bm{y})$ が大きい(正の値)なら、$\bm{x}$ と $\bm{y}$ が近い入力なら出力も似た値を取る、ということです。
カーネルが関数の滑らかさを決める
ガウス過程の振る舞いはカーネルの選択でほぼ決まります。
- RBFカーネル: 無限回微分可能な滑らかな関数を実現
- Matérnカーネル($\nu = 3/2$): 1回微分可能
- Matérnカーネル($\nu = 5/2$): 2回微分可能
- 指数カーネル: 連続だが微分不可能(ブラウン運動的)
- 周期カーネル: 周期関数のサンプル
長さスケール $\ell$ は「どれくらいの距離で関数値が独立に変化するか」を決めます。$\ell$ が大きいと長い波長、$\ell$ が小さいと短い波長の関数になります。
ガウス過程回帰の予測式
訓練データ $(X, \bm{y})$ が与えられたとき、新しい入力 $X_*$ に対する予測は次のような閉形式で得られます(ノイズ分散 $\sigma_n^2$)。
$$ \bm{f}_* | X, \bm{y}, X_* \sim \mathcal{N}(\bar{\bm{f}}_*, \mathrm{cov}(\bm{f}_*)) $$
$$ \bar{\bm{f}}_* = \bm{K}_*^T (\bm{K} + \sigma_n^2 \bm{I})^{-1} \bm{y} $$
$$ \mathrm{cov}(\bm{f}_*) = \bm{K}_{**} – \bm{K}_*^T (\bm{K} + \sigma_n^2 \bm{I})^{-1} \bm{K}_* $$
ここで $\bm{K}$ は訓練データ間のカーネル行列、$\bm{K}_*$ は訓練データと予測点間、$\bm{K}_{**}$ は予測点間のカーネル行列です。SVMと同じく、データへのアクセスがすべてカーネル経由になっていることに注目してください。
ガウス過程の魅力は、予測値だけでなく予測の不確実性まで得られることです。データが多い領域では分散が小さく、データが少ない領域では分散が大きくなり、「自分が自信を持って言える領域」を明示的に示せます。詳しくはガウス過程回帰を参照してください。

SVMとガウス過程の対比
同じカーネルを共有しながら、SVMはマージン最大化を目指す決定論的手法、GPは関数の事前分布を考える確率的手法、と立場がまったく異なります。SVMはクラスラベルや回帰値を直接返し計算量が比較的軽い一方、GPは予測の不確実性まで自然に得られますが学習に $O(n^3)$ を要します。カーネルの解釈も「特徴空間の内積」vs「共分散関数」と異なる視点に立っており、カーネルを介して両者が結ばれていることは機械学習理論の美しい統一の一つです。次に、カーネルを使ったもう一つの応用——次元削減——を見ていきます。
kernel PCAとkernel ridge regression
kernel PCA — 非線形主成分分析
主成分分析(PCA)は、データの共分散行列 $\bm{C} = \frac{1}{n}\sum_i (\bm{x}_i – \bar{\bm{x}})(\bm{x}_i – \bar{\bm{x}})^T$ の固有ベクトルを求めて、データを低次元に射影する手法です。これは線形変換なので、非線形構造(スイスロール、月の形のデータなど)はうまく扱えません。
kernel PCAは、データを特徴空間 $\mathcal{H}$ に写像してからPCAを実行するアイデアです。特徴空間での共分散行列は陽には書けませんが、内積(=カーネル)だけ使う形に変形できます。具体的には、中心化されたカーネル行列
$$ \tilde{\bm{K}} = \bm{K} – \bm{1}_n \bm{K} – \bm{K} \bm{1}_n + \bm{1}_n \bm{K} \bm{1}_n $$
($\bm{1}_n$ は全要素 $1/n$ の $n \times n$ 行列)の固有値問題
$$ \tilde{\bm{K}} \bm{\alpha}_k = n \lambda_k \bm{\alpha}_k $$
を解き、新しい点 $\bm{x}_*$ の $k$ 番目の主成分を
$$ y_k(\bm{x}_*) = \sum_{i=1}^n \alpha_{k,i} k(\bm{x}_i, \bm{x}_*) $$
として計算します。RBFカーネルを使えば、無限次元空間でのPCAを有限次元の固有値問題で解いていることになります。

kernel ridge regression
リッジ回帰 $\min_{\bm{w}} \sum_i (y_i – \bm{w}^T \bm{x}_i)^2 + \lambda \|\bm{w}\|^2$ を特徴空間に持ち上げると、表現定理により $\bm{w} = \sum_i \alpha_i \bm{\Phi}(\bm{x}_i)$ と書けて、
$$ \bm{\alpha} = (\bm{K} + \lambda \bm{I})^{-1} \bm{y}, \quad f(\bm{x}_*) = \sum_i \alpha_i k(\bm{x}_i, \bm{x}_*) $$
というシンプルな式に帰着します。ガウス過程回帰の平均予測と完全に一致することに気づきましたか?ノイズ分散 $\sigma_n^2$ を正則化係数 $\lambda$ と読み替えれば、両者は同じ式です。ガウス過程回帰の平均予測は、本質的にカーネルリッジ回帰なのです。

計算量とスケーラビリティ
カーネル法の共通の弱点は、$n \times n$ カーネル行列を扱うことに起因する計算量です。メモリは $O(n^2)$、学習は $O(n^3)$(行列反転)、予測はサポートベクター数に比例します。$n = 10000$ 程度なら扱えますが、$n = 10^5$ を超えるとNyström近似やランダム特徴量(random Fourier features)、誘導点法などの大規模化技法が必要になります。
ここまででカーネル法がさまざまな機械学習アルゴリズムを統一的に拡張できることを見てきました。最後に、これらすべての背後にある数学的な枠組み——再生核ヒルベルト空間(RKHS)——に触れておきましょう。
再生核ヒルベルト空間(RKHS)
RKHSのモチベーション
ここまでの議論で、カーネル $k$ から特徴写像 $\bm{\Phi}$ が(Mercerの定理によって)存在することは分かりました。では、その特徴空間 $\mathcal{H}$ 自体には何か特別な構造があるのでしょうか。実は、$\mathcal{H}$ は関数の集合として理解するのが自然で、これを再生核ヒルベルト空間(Reproducing Kernel Hilbert Space, RKHS)と呼びます。
RKHSの定義
集合 $\Omega$ 上の実数値関数からなるヒルベルト空間 $\mathcal{H}$ が再生核ヒルベルト空間であるとは、任意の $\bm{x} \in \Omega$ に対して、評価汎関数 $f \mapsto f(\bm{x})$ が連続(有界)であることを言います。
リースの表現定理により、この有界線形汎関数は内積で表せます。すなわち各 $\bm{x}$ に対して、ある $k_{\bm{x}} \in \mathcal{H}$ が存在して
$$ f(\bm{x}) = \langle f, k_{\bm{x}} \rangle_{\mathcal{H}} $$
が成り立ちます。この $k_{\bm{x}}(\cdot) = k(\bm{x}, \cdot)$ を再生核と呼びます。
再生性
$k_{\bm{x}} \in \mathcal{H}$ なので、これ自体を $f$ として上の式に代入できます。$f = k_{\bm{y}}$ とすると、
$$ k_{\bm{y}}(\bm{x}) = \langle k_{\bm{y}}, k_{\bm{x}} \rangle_{\mathcal{H}} $$
すなわち
$$ k(\bm{x}, \bm{y}) = \langle k(\bm{x}, \cdot), k(\bm{y}, \cdot) \rangle_{\mathcal{H}} $$
が得られます。これが再生性と呼ばれる、RKHSの核心的な性質です。カーネル関数 $k(\bm{x}, \bm{y})$ そのものが、特徴空間における内積の値に等しいのです。
ここで $\bm{\Phi}(\bm{x}) = k(\bm{x}, \cdot)$ と置けば、これが特徴写像になっていることが分かります——「点 $\bm{x}$」を「関数 $k(\bm{x}, \cdot)$」に対応付ける写像で、特徴空間は関数の空間 $\mathcal{H}$ そのものです。Mercerの展開 $k(\bm{x}, \bm{y}) = \sum_i \lambda_i \psi_i(\bm{x}) \psi_i(\bm{y})$ で言えば、$\bm{\Phi}(\bm{x})$ は $(\sqrt{\lambda_i} \psi_i(\bm{x}))_i$ という座標を持つベクトルです。

RKHSと表現定理
表現定理は、RKHSの言葉で次のように述べられます。正則化付き経験リスク最小化
$$ \min_{f \in \mathcal{H}} \sum_i L(y_i, f(\bm{x}_i)) + \lambda \|f\|_{\mathcal{H}}^2 $$
の解 $f^*$ は、必ず
$$ f^*(\cdot) = \sum_i c_i k(\bm{x}_i, \cdot) $$
の形で書けます。証明のスケッチは、$f$ を「訓練点における再生核の張る部分空間」とその直交補空間に分解すると、直交補空間成分は損失に寄与せず正則化項だけを増やすので、最適解は必ず再生核の部分空間に含まれる、というものです。
この定理のおかげで、無限次元の関数空間における最適化問題が、$n$ 個の係数 $c_i$ の最適化問題に帰着します。カーネル法が「無限次元でありながら計算可能」である本当の理由がここにあります。
RKHSノルム $\|f\|_{\mathcal{H}}^2 = \langle f, f \rangle_{\mathcal{H}}$ は関数の「複雑さ」を測る尺度で、$f^* = \sum_i c_i k(\bm{x}_i, \cdot)$ の場合は $\bm{c}^T \bm{K} \bm{c}$ という2次形式になります。正則化項 $\lambda \|f\|_{\mathcal{H}}^2$ はこの複雑さにペナルティを与え、過学習を抑制します。
理論面の概観はここまでにして、いよいよ実装で手を動かしながら、これらのアルゴリズムを体感していきましょう。
Python実装 — SVM、GP、kernel PCAの比較
ここからはscikit-learnを使って、ここまで議論してきたアルゴリズムを実際に動かします。同じデータに対してさまざまなカーネルを試し、決定境界や予測がどう変わるかを可視化します。
カーネル関数の可視化
まずカーネル関数そのものをプロットして、各カーネルの「類似度」のかたちを確認します。
import numpy as np
import matplotlib.pyplot as plt
# 1次元上の点 x0 = 0 を基準点として、他の点 x との類似度をプロット
x = np.linspace(-3, 3, 500)
x0 = 0.0
# 各カーネル関数
def linear_kernel(x, y):
return x * y
def poly_kernel(x, y, p=3, c=1.0):
return (x * y + c) ** p
def rbf_kernel(x, y, gamma=1.0):
return np.exp(-gamma * (x - y) ** 2)
def matern_kernel_32(x, y, ell=1.0):
r = np.abs(x - y) / ell
return (1 + np.sqrt(3) * r) * np.exp(-np.sqrt(3) * r)
def periodic_kernel(x, y, p=2.0, ell=1.0):
return np.exp(-2 * np.sin(np.pi * np.abs(x - y) / p) ** 2 / ell ** 2)
fig, axes = plt.subplots(1, 5, figsize=(20, 4))
kernels = [
("Linear", linear_kernel(x, x0)),
("Polynomial (p=3)", poly_kernel(x, x0)),
("RBF (gamma=1)", rbf_kernel(x, x0)),
("Matern (nu=3/2)", matern_kernel_32(x, x0)),
("Periodic (p=2)", periodic_kernel(x, x0)),
]
for ax, (name, k) in zip(axes, kernels):
ax.plot(x, k, lw=2)
ax.axvline(x0, color="red", linestyle="--", alpha=0.5, label="reference point")
ax.set_title(name)
ax.set_xlabel("x")
ax.set_ylabel("k(x, 0)")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
上の5枚のプロットから、各カーネルの個性がはっきり読み取れます。線形カーネルは基準点からの距離に対して直線的に変化し、内積の値そのものを返します(負の値も取りうる)。多項式カーネルは基準点近傍では緩やかですが、絶対値の大きい領域で急激に値が爆発し、滑らかさと表現力のトレードオフが見えます。RBFカーネルは基準点で最大値1、距離とともに指数的に減衰し、対称な釣鐘型をしているため類似度として最も直感的です。MatérnカーネルはRBFよりやや鋭く、現実の物理現象に合いやすい中庸の滑らかさを持ちます。周期カーネルは周期 $p = 2$ ごとに最大値を取り、周期構造の表現に適していることが明確に分かります。
線形分離不可能なデータ — RBFカーネルSVMの威力
次に、まさに冒頭で議論したような同心円状のデータを作り、線形SVMとRBFカーネルSVMで分類性能を比較します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.svm import SVC
# 同心円データ
np.random.seed(42)
X, y = make_circles(n_samples=300, noise=0.1, factor=0.4, random_state=42)
# 線形SVM と RBF カーネルSVM
svm_linear = SVC(kernel="linear", C=1.0)
svm_rbf = SVC(kernel="rbf", C=1.0, gamma=1.0)
svm_linear.fit(X, y)
svm_rbf.fit(X, y)
# 決定境界の可視化
def plot_decision_boundary(ax, clf, X, y, title):
h = 0.02
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, levels=20, cmap="RdBu_r", alpha=0.6)
ax.contour(xx, yy, Z, levels=[0], colors="black", linewidths=2)
ax.scatter(X[:, 0], X[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
acc = clf.score(X, y)
ax.set_title(f"{title} (accuracy={acc:.2f})")
ax.set_xlabel("x1")
ax.set_ylabel("x2")
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
plot_decision_boundary(axes[0], svm_linear, X, y, "Linear SVM")
plot_decision_boundary(axes[1], svm_rbf, X, y, "RBF Kernel SVM")
plt.tight_layout()
plt.show()
左の線形SVMは、同心円データを直線で分離しようと頑張りますが、原理的に不可能なため精度は50%程度(ほぼランダム)に留まります。一方、右のRBFカーネルSVMは、円形の決定境界を学習して内側のクラスと外側のクラスを完全に分離します。この円形の境界は、特徴空間(無限次元!)における線形な超平面が元の2次元空間に逆射影された結果です。「高次元での線形分離が、元空間での非線形分離になる」というカーネル法の核心が、目で見て確認できる瞬間です。
ガウスカーネルのバンド幅 $\gamma$ の効果
次にRBFカーネルの $\gamma$ パラメータを変えて、決定境界の複雑さがどう変わるかを見ます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.svm import SVC
# 月型データ
X, y = make_moons(n_samples=200, noise=0.2, random_state=0)
gammas = [0.1, 1.0, 10.0, 100.0]
fig, axes = plt.subplots(1, 4, figsize=(20, 5))
for ax, gamma in zip(axes, gammas):
svm = SVC(kernel="rbf", C=1.0, gamma=gamma)
svm.fit(X, y)
h = 0.02
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
ax.contourf(xx, yy, Z, levels=20, cmap="RdBu_r", alpha=0.6)
ax.contour(xx, yy, Z, levels=[0], colors="black", linewidths=2)
ax.scatter(X[:, 0], X[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
acc = svm.score(X, y)
ax.set_title(f"gamma={gamma}, acc={acc:.2f}")
ax.set_xlabel("x1")
ax.set_ylabel("x2")
plt.tight_layout()
plt.show()
$\gamma$ を $0.1 \to 1 \to 10 \to 100$ と上げると、決定境界が「滑らかな曲線」から「データに細かくフィットした複雑な領域」へと変化します。$\gamma = 0.1$ では境界がほぼ線形に近く、訓練データの一部を誤分類しますが汎化性能は高そうに見えます。$\gamma = 100$ では訓練精度は100%近くになりますが、各データ点の周りに局所的なバブルができ、明らかに過学習しています。実務では交差検証で $\gamma$ と $C$ を選ぶのが定石で、たとえば $\gamma \in \{10^{-3}, 10^{-2}, \dots, 10^2\}, C \in \{10^{-1}, 1, 10, 100\}$ をグリッドサーチして検証スコアが最良のものを採用します。
多項式カーネルとの比較
異なるカーネルを用いた場合の決定境界の質的な違いを比較します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.svm import SVC
X, y = make_moons(n_samples=200, noise=0.2, random_state=0)
kernels_config = [
("linear", {}),
("poly", {"degree": 3, "coef0": 1.0}),
("poly", {"degree": 5, "coef0": 1.0}),
("rbf", {"gamma": 1.0}),
("sigmoid", {"gamma": 0.5, "coef0": 0.0}),
]
fig, axes = plt.subplots(1, 5, figsize=(22, 5))
for ax, (kernel, params) in zip(axes, kernels_config):
svm = SVC(kernel=kernel, C=1.0, **params)
svm.fit(X, y)
h = 0.02
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
ax.contourf(xx, yy, Z, levels=20, cmap="RdBu_r", alpha=0.6)
ax.contour(xx, yy, Z, levels=[0], colors="black", linewidths=2)
ax.scatter(X[:, 0], X[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
acc = svm.score(X, y)
name = kernel + (f" d={params.get('degree')}" if "degree" in params else "")
ax.set_title(f"{name}, acc={acc:.2f}")
ax.set_xlabel("x1")
ax.set_ylabel("x2")
plt.tight_layout()
plt.show()
各カーネルが描く決定境界の「形」に注目すると、線形カーネルは1本の直線、多項式カーネル(次数3)はゆるやかな2次曲線、次数5はさらに表現力のある曲線になります。RBFカーネルは月型データの形状に自然にフィットし、シグモイドカーネルは部分的にうまく分けますが、月型のように曲がりくねった構造には RBF ほどフィットしません。多項式カーネルでは次数を上げると訓練精度が上がりますが、無関係な領域でも値が極端になりやすく、外挿性能が悪化する傾向があります。実務でデータが直感的にどんな構造を持つかを把握できれば、適切なカーネルの選択肢が絞り込めます。
ガウス過程回帰
カーネル法の確率的な側面として、ガウス過程回帰を実演します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, Matern, WhiteKernel, ConstantKernel as C
# 真の関数 y = sin(x) + 0.1 * x にノイズを加えたデータ
np.random.seed(1)
X_train = np.sort(np.random.uniform(-5, 5, 15)).reshape(-1, 1)
y_train = np.sin(X_train).ravel() + 0.1 * X_train.ravel() + 0.1 * np.random.randn(15)
X_test = np.linspace(-7, 7, 300).reshape(-1, 1)
# 3つのカーネル
kernels = {
"RBF": C(1.0) * RBF(length_scale=1.0) + WhiteKernel(noise_level=0.1),
"Matern (nu=1.5)": C(1.0) * Matern(length_scale=1.0, nu=1.5) + WhiteKernel(noise_level=0.1),
"Matern (nu=2.5)": C(1.0) * Matern(length_scale=1.0, nu=2.5) + WhiteKernel(noise_level=0.1),
}
fig, axes = plt.subplots(1, 3, figsize=(20, 5))
for ax, (name, kernel) in zip(axes, kernels.items()):
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=5, random_state=0)
gp.fit(X_train, y_train)
y_pred, y_std = gp.predict(X_test, return_std=True)
ax.plot(X_test, np.sin(X_test) + 0.1 * X_test, "g--", lw=1.5, label="true function")
ax.plot(X_test, y_pred, "b", lw=2, label="GP mean")
ax.fill_between(X_test.ravel(), y_pred - 2 * y_std, y_pred + 2 * y_std,
alpha=0.2, color="blue", label="95% CI")
ax.scatter(X_train, y_train, c="red", edgecolors="k", s=50, zorder=5, label="train")
ax.set_title(f"GP with {name}")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend(loc="upper left", fontsize=9)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
3つのカーネルすべてが訓練データの近くではほぼ同じ予測になりますが、訓練データから離れた外挿領域($x < -5$ や $x > 5$)で違いが現れます。RBFカーネルは無限回微分可能なほど滑らかな予測を出し、Matérn ($\nu = 1.5$) は最も急に変化を許し、Matérn ($\nu = 2.5$) はその中間です。すべてのカーネルで、データから離れるほど信頼区間(青い帯)が広がっていることに注目してください——これがガウス過程の最大の強みで、「データのない領域では自信を持って予測できない」ことを明示できます。SVMにはこのような不確実性の自然な定量化は組み込まれておらず、カーネル法の確率的解釈の利点が際立ちます。
kernel PCA — 非線形次元削減
最後にkernel PCAで、線形PCAでは捉えられない構造を可視化してみましょう。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.decomposition import PCA, KernelPCA
# 同心円データ
X, y = make_circles(n_samples=400, factor=0.3, noise=0.05, random_state=42)
# 通常のPCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# kernel PCA (RBF カーネル)
kpca = KernelPCA(n_components=2, kernel="rbf", gamma=10)
X_kpca = kpca.fit_transform(X)
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
axes[0].scatter(X[:, 0], X[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
axes[0].set_title("Original space")
axes[0].set_xlabel("x1")
axes[0].set_ylabel("x2")
axes[1].scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
axes[1].set_title("Linear PCA")
axes[1].set_xlabel("PC1")
axes[1].set_ylabel("PC2")
axes[2].scatter(X_kpca[:, 0], X_kpca[:, 1], c=y, cmap="RdBu_r", edgecolors="k", s=40)
axes[2].set_title("Kernel PCA (RBF, gamma=10)")
axes[2].set_xlabel("KPC1")
axes[2].set_ylabel("KPC2")
plt.tight_layout()
plt.show()
左の元データはご存知の同心円構造で、内側と外側の2つのクラスがあります。中央の線形PCAは、もともと線形変換しかできないので円構造をほどけません——主軸が回転するだけで、内側と外側のクラスは依然として円形に重なり合っています。右のkernel PCAは、RBFカーネルで定義された無限次元特徴空間でPCAを行った結果を可視化したもので、内側のクラスと外側のクラスが線形分離可能なように展開されています。同じ「PCA」でもカーネルを介すことで、扱える構造の幅がここまで広がるのです。この性質は次元削減後に線形分類器を後段に置く前処理として、また高次元データの非線形構造を可視化する目的で非常に有用です。
カーネルリッジ回帰の動作確認
最後に、カーネルリッジ回帰でSVMやGPとは別の角度からカーネル法を体感します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.kernel_ridge import KernelRidge
# 非線形関数のフィッティング
np.random.seed(0)
X = np.sort(np.random.uniform(-5, 5, 100)).reshape(-1, 1)
y = np.sin(X).ravel() + 0.3 * np.random.randn(100)
X_test = np.linspace(-6, 6, 300).reshape(-1, 1)
# カーネルごとに比較
configs = [
("linear", {}),
("polynomial", {"degree": 3, "coef0": 1}),
("rbf", {"gamma": 0.5}),
]
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
for ax, (kernel, params) in zip(axes, configs):
kr = KernelRidge(alpha=0.1, kernel=kernel, **params)
kr.fit(X, y)
y_pred = kr.predict(X_test)
ax.scatter(X, y, c="blue", alpha=0.4, label="data")
ax.plot(X_test, np.sin(X_test), "g--", lw=1.5, label="true sin(x)")
ax.plot(X_test, y_pred, "r", lw=2, label="kernel ridge")
ax.set_title(f"Kernel: {kernel}")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
線形カーネルでは正弦波のような非線形関数はまったくフィットできず、ほぼ水平な直線になります。多項式カーネル(次数3)は中心付近ではある程度形を捉えますが、端の方では極端な値に発散して暴れてしまいます。RBFカーネルは正弦波を非常によくフィットでき、データの範囲を少し超えた外挿でも自然な振る舞いを保ちます。カーネルリッジ回帰の予測 $f(\bm{x}_*) = \sum_i \alpha_i k(\bm{x}_i, \bm{x}_*)$ は、訓練データ点を「中心」とした基底関数の重ね合わせとして関数を表現していることが視覚的に分かります。先に述べたとおり、これはガウス過程回帰の平均予測と数式的に等価です。
まとめ
本記事では、カーネル法とカーネルトリックについて、直感から数学的な土台、応用、Pythonでの実装までを通して解説しました。
- カーネル法の核心: 元の空間で線形分離できないデータでも、適切な特徴写像 $\bm{\Phi}$ で高次元空間に持ち上げれば線形分離できる
- カーネルトリック: アルゴリズムが内積 $\bm{\Phi}(\bm{x})^T \bm{\Phi}(\bm{y})$ だけ使うなら、$\bm{\Phi}$ を陽に計算せず $k(\bm{x}, \bm{y})$ だけで済む
- Mercerの定理: 対称・半正定値な関数 $k$ は必ず何らかの内積として表現でき、特徴写像の存在が保証される
- 代表的カーネル: 線形(基本)、多項式(明示的な特徴展開)、RBF(無限次元、デフォルト)、Matérn(滑らかさ調整)、周期(周期構造)
- SVMでのカーネルトリック: 双対形式で内積を $k$ に置き換えるだけで、非線形SVMが完成
- ガウス過程との関係: カーネル = 共分散関数。同じ $k$ がSVMとGPで全く異なる解釈を持つ
- kernel PCA / kernel ridge regression: 線形手法のすべてが、内積を $k$ に置き換えるだけで非線形版に拡張可能
- RKHS: 特徴空間の正体は「関数の集合 = 再生核ヒルベルト空間」で、表現定理によって無限次元の最適化が有限個の係数に帰着する
カーネル法は、深層学習が席巻する以前の機械学習を支えた中核技術ですが、現在もガウス過程やニューラルネットの理論解析(neural tangent kernel)で活発に使われています。深層学習が万能ではない場面——データが少ない、不確実性が必要、解釈性が欲しい、ハイパーパラメータをじっくり調整したい——では、今でもカーネル法は最良の選択肢になります。
次のステップとして、以下の記事もぜひ参考にしてください。