ridge_kernel_gaussian.py 技術ドキュメント

プログラムの動作

ridge_kernel_gaussian.py は、ガウスカーネルを使用したカーネルリッジ回帰を実行するPythonスクリプトです。与えられた入力データ(\(x, y\)ペア)に対して、ガウスカーネルを用いて非線形な回帰モデルを構築し、データへのフィッティングを行います。主な機能は以下の通りです。

  1. データ読み込み: Excelファイルから\(x\)\(y\)のデータセットを読み込みます。

  2. カーネルリッジ回帰: 読み込んだデータを用いて、ガウスカーネルとリッジ正則化を適用したカーネルリッジ回帰モデルを訓練し、係数\(c_i\)を計算します。

  3. 予測: 訓練されたモデルに基づき、入力データの範囲内で補間された\(x\)値に対する\(y\)の予測値を計算します。

  4. 結果の可視化: 入力データ、フィッティング曲線、および計算された係数\(c_i\)をmatplotlibを使ってグラフにプロットし、表示します。

  5. パラメータ設定: ガウスカーネルの幅 (\(w_G\)) とリッジ正則化パラメータ (\(\lambda\)) をコマンドライン引数で指定できます。

このプログラムは、線形モデルでは表現が難しい非線形な関係を持つデータに対して、柔軟なフィッティングモデルを構築し、視覚的に結果を確認することを目的としています。

原理

ridge_kernel_gaussian.py は、カーネルリッジ回帰 (Kernel Ridge Regression) の原理に基づいています。これは、線形リッジ回帰をカーネル関数によって高次元の特徴空間に拡張したものです。

1. ガウスカーネル

このプログラムでは、ガウスカーネル (Gaussian Kernel) を使用します。ガウスカーネルは、2つのデータ点\(x_i\)\(x_j\)の間の類似度を測る関数で、以下の式で定義されます。

\[ K(x_i, x_j) = \exp\left(-\left(\frac{x_i - x_j}{w_G}\right)^2\right) \]

ここで、\(w_G\)はガウスカーネルの幅(またはバンド幅)と呼ばれるパラメータで、類似度の減衰の速さを制御します。\(w_G\)が大きいほど遠くの点との類似度も高く評価され、小さいほど近くの点のみが類似と見なされます。

2. カーネルリッジ回帰の定式化

カーネルリッジ回帰では、未知の関数\(f(x)\)を、訓練データ点\(x_k\)におけるカーネル関数の線形結合として近似します。

\[ f(x) = \sum_{k=1}^{n} c_k K(x, x_k) \]

ここで、\(c_k\)は係数、\(n\)は訓練データ点の数です。これらの係数\(c_k\)は、以下の正則化された最小二乗問題を解くことによって求められます。

\[ \min_c \sum_{i=1}^{n} (y_i - f(x_i))^2 + \lambda \sum_{k=1}^{n} c_k^2 \]

この最適化問題の解は、以下の線形方程式を解くことで得られます。

\[ (K + \lambda I) c = y \]

ここで、

  • \(K\)はカーネル行列(またはグラム行列)で、その要素は\(K_{ij} = K(x_i, x_j)\)です。

  • \(I\)は単位行列です。

  • \(\lambda\)はリッジ正則化パラメータで、モデルの複雑さを制御し、過学習を防ぎます。\(\lambda\)が大きいほど、係数\(c_k\)が小さくなり、モデルが単純化されます。

  • \(c\)は求めたい係数ベクトル \((c_1, c_2, \dots, c_n)^T\) です。

  • \(y\)はターゲット値のベクトル \((y_1, y_2, \dots, y_n)^T\) です。

プログラムでは、KernelRidge 関数内でこの線形方程式をnp.linalg.inv(Sij) @ Siとして計算しています。ここでSij\(K+\lambda I\)に相当し、Si\(y\)に相当します。

3. 予測

係数\(c_k\)が計算された後、任意の新しい点\(\tilde{x}\)に対する予測値\(y_{cal}(\tilde{x})\)は、再びカーネル関数の線形結合として計算されます。

\[ y_{cal}(\tilde{x}) = \sum_{k=1}^{n} c_k K(\tilde{x}, x_k) \]

必要な非標準ライブラリとインストール方法

本プログラムの実行には、以下のPythonライブラリが必要です。これらは標準ライブラリではないため、事前にインストールする必要があります。

  • NumPy: 数値計算を効率的に行うためのライブラリです。

  • pandas: データ解析ライブラリで、特にExcelファイルの読み込みに使用されます。

  • matplotlib: グラフ描画ライブラリです。

  • openpyxl: pandasがExcelファイルを読み書きする際に内部的に使用するエンジンです。

これらのライブラリは、pipコマンドを使用して一括でインストールできます。

pip install numpy pandas matplotlib openpyxl

必要な入力ファイル

プログラムは、\(x\)\(y\)のデータを含むExcelファイルを読み込みます。

  • ファイル形式: Microsoft Excel (.xlsx) 形式。

  • データ構造:

    • ファイルの最初のシートを使用します。

    • 最初の列が\(x\)データ(独立変数)を含みます。

    • 2番目の列が\(y\)データ(従属変数)を含みます。

    • 各列にはヘッダー(ラベル)が必要です。

  • デフォルトのファイル名: random-poly-Gauss.xlsx

    • コマンドライン引数で変更しない場合、この名前のファイルがカレントディレクトリに存在する必要があります。

例 (Excelファイルの内容):

Label X

Label Y

1.0

2.1

2.0

3.9

3.0

5.8

...

...

生成される出力ファイル

ridge_kernel_gaussian.py は、以下の内容を出力します。

  • コンソール出力:

    • プログラムの開始メッセージ、設定されたパラメータ(入力ファイル名、ガウスカーネル幅、リッジパラメータ)。

    • KernelRidge 関数内部でのカーネル行列 (Sij) とターゲットベクトル (Si) の内容。

    • 各データ点\(x_i\)とそれに対応する計算された係数\(c_i\)のリスト。

    • プログラム終了時のメッセージ。

  • グラフィカル出力:

    • matplotlib によって生成されたグラフウィンドウが表示されます。このグラフは以下の2つのサブプロットを含みます。

      1. 左側のプロット:

        • 入力データ点 (\(x\) vs \(y\)) を散布図で表示。

        • カーネルリッジ回帰によってフィッティングされた曲線 (\(x_{cal}\) vs \(y_{cal}\)) を実線で表示。

      2. 右側のプロット:

        • 計算された各係数\(c_i\) (\(i\) vs \(c_i\)) をプロット。

プログラムは、ユーザーがEnterキーを押すまでこのグラフウィンドウを表示したまま待機します。グラフィカルな出力はファイルとしては保存されません。

コマンドラインでの使用例 (Usage)

プログラムは、コマンドライン引数を受け付けることができます。

python ridge_kernel_gaussian.py [input_excel_file] [gaussian_width] [ridge_lambda]
  • input_excel_file (オプション): 使用するExcelファイルの名前。デフォルトは random-poly-Gauss.xlsx です。

  • gaussian_width (オプション): ガウスカーネルの幅 (\(w_G\))。浮動小数点数で指定します。デフォルトは 0.1 です。

  • ridge_lambda (オプション): リッジ正則化パラメータ (\(\lambda\))。浮動小数点数で指定します。デフォルトは 0.0 です。

引数は左から順に処理されるため、例えば ridge_lambda を指定するには、input_excel_filegaussian_width も指定する必要があります。

コマンドラインでの具体的な使用例

例1: デフォルト設定での実行

入力ファイル名、ガウスカーネル幅、リッジパラメータをデフォルト値のまま使用します。

python ridge_kernel_gaussian.py

実行結果の説明: プログラムは、カレントディレクトリにある random-poly-Gauss.xlsx ファイルを読み込みます。ガウスカーネルの幅は 0.1、リッジパラメータは 0.0 として計算が実行されます。コンソールにはカーネル行列や係数の値が出力され、最終的に\(x-y\)プロットと\(i-c_i\)プロットを含むグラフウィンドウが表示されます。Enterキーを押すとプログラムが終了します。

例2: カスタムパラメータでの実行

別の入力ファイルを指定し、ガウスカーネル幅を 0.05、リッジパラメータを 0.001 に設定して実行します。

python ridge_kernel_gaussian.py my_data.xlsx 0.05 0.001

実行結果の説明: プログラムは my_data.xlsx (このファイルは事前に存在する必要があります) を読み込みます。ガウスカーネルの幅は 0.05、リッジパラメータは 0.001 が適用され、それ以外の動作はデフォルト実行時と同じです。計算結果とプロットが画面に表示されます。これらのパラメータを変更することで、フィッティングの滑らかさや過学習への耐性を調整できます。