Ridge Gaussian Basis Regression

プログラムの動作

ridge_gaussian_basis.py は、与えられた2次元データ (\(x, y\)) に対して、ガウス基底関数を用いたリッジ回帰を実行し、データのフィッティングモデルを構築するプログラムです。このプログラムは、入力としてExcelファイルからデータを読み込み、コマンドライン引数によってガウス基底関数の数、その幅、およびリッジ正則化の強度を調整できます。

主な機能は以下の通りです。

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

  • ガウス基底関数の設定: データ範囲に基づいて等間隔に配置されたガウス基底関数の中心と、指定された幅を使用します。

  • リッジ回帰: ガウス基底関数に対する係数を、L2正則化項(リッジ項)を含む線形最小二乗法で計算します。これにより、過学習を抑制し、汎化性能の高いモデルを構築します。

  • 結果の可視化: 元の入力データ、フィッティングによって得られた曲線、および各ガウス基底関数の係数を matplotlib を用いてグラフ表示します。

このプログラムは、ノイズを含むデータや単純な多項式では表現しにくい複雑な形状のデータを、柔軟なガウス基底関数と正則化手法を組み合わせることで、高精度かつ安定的に近似するという課題を解決します。

原理

ridge_gaussian_basis.py は、以下の原理に基づいています。

ガウス基底関数

データ \(x\) を表現するために、ガウス関数を基底関数として使用します。\(k\) 番目のガウス基底関数 \(\phi_k(x)\) は次のように定義されます。

\[\phi_k(x) = \exp \left( -\left( \frac{x - x_{0,k}}{w_G} \right)^2 \right)\]

ここで、\(x_{0,k}\)\(k\) 番目のガウス基底関数の中心座標、\(w_G\) はすべてのガウス基底関数に共通の幅(標準偏差に関連)を表します。プログラムでは、ガウス関数の中心 \(x_{0,k}\) は入力データの \(x\) 範囲内で nG 個が等間隔に配置されます。

線形モデル

目的変数 \(y(x)\) は、これらのガウス基底関数の線形結合としてモデル化されます。

\[y(x) = \sum_{k=0}^{nG-1} c_k \phi_k(x)\]

ここで、\(c_k\) は各ガウス基底関数に対応する係数です。

リッジ回帰 (L2正則化付き線形最小二乗法)

係数 \(c_k\) を決定するために、リッジ回帰が適用されます。リッジ回帰は、通常の線形最小二乗法のコスト関数にL2正則化項(リッジ項)を追加したものです。これにより、係数が過度に大きくなることを防ぎ、モデルの過学習を抑制します。

コスト関数 \(J(\mathbf{c})\) は次のように定義されます。

\[J(\mathbf{c}) = \sum_{i=1}^{N} \left(y_i - \sum_{k=0}^{nG-1} c_k \phi_k(x_i)\right)^2 + \lambda \sum_{k=0}^{nG-1} c_k^2\]

ここで、\(N\) はデータ点数、\(y_i\)\(i\) 番目の目的変数、\(x_i\)\(i\) 番目の独立変数、\(\lambda\) はリッジパラメータ(正則化の強度)です。\(\lambda = 0\) の場合、通常の線形最小二乗法と同じになります。

このコスト関数を最小化する係数ベクトル \(\mathbf{c} = (c_0, c_1, \ldots, c_{nG-1})^T\) は、以下の正規方程式を解くことで得られます。

\[(\mathbf{\Phi}^T \mathbf{\Phi} + \lambda \mathbf{I}) \mathbf{c} = \mathbf{\Phi}^T \mathbf{y}\]

ここで、

  • \(\mathbf{\Phi}\) は計画行列(design matrix)であり、その \(i\)\(k\) 列目の要素は \(\mathbf{\Phi}_{ik} = \phi_k(x_i)\) です。

  • \(\mathbf{y}\) は目的変数ベクトルであり、\(\mathbf{y} = (y_0, y_1, \ldots, y_{N-1})^T\) です。

  • \(\mathbf{I}\)\(nG \times nG\) の単位行列です。

プログラム中の Ridge 関数では、Sij\((\mathbf{\Phi}^T \mathbf{\Phi} + \lambda \mathbf{I})\) に対応し、Si\(\mathbf{\Phi}^T \mathbf{y}\) に対応します。np.linalg.inv(Sij) @ Si により、係数ベクトル \(\mathbf{c}\) が計算されます。

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

ridge_gaussian_basis.py を実行するには、以下の非標準Pythonライブラリが必要です。

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

  • openpyxl: Excel .xlsx ファイルの読み書きを行うためのライブラリ。

  • pandas: データ解析を効率的に行うためのライブラリ。特にデータフレーム形式でのデータ操作に優れています。

  • matplotlib: グラフ描画のためのライブラリ。

これらのライブラリは、Pythonのパッケージマネージャー pip を使用してインストールできます。

pip install numpy openpyxl pandas matplotlib

必要な入力ファイル

プログラムは以下の形式のExcelファイル (.xlsx) を入力として期待します。

  • ファイル名: デフォルトでは random-poly-Gauss.xlsx ですが、コマンドライン引数で任意のファイル名を指定できます。

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

  • データ構造:

    • ヘッダ行: データシートの1行目はヘッダ行である必要があります。

    • 1列目: 独立変数 \(x\) のデータが格納されている必要があります。

    • 2列目: 従属変数 \(y\) のデータが格納されている必要があります。

例: input_data.xlsx

x_value

y_value

0.1

1.2

0.2

1.5

0.3

1.1

...

...

生成される出力ファイル

ridge_gaussian_basis.py は、ディスク上に新しいファイルを生成しません。

実行結果は、matplotlib によって生成されるグラフィカルユーザーインターフェース (GUI) ウィンドウにリアルタイムで表示されます。このウィンドウには、2つのサブプロットが含まれます。

  • 左側のプロット:

    • 入力された \(x, y\) データ点 (input) が散布図として表示されます。

    • リッジ回帰によって計算されたモデルに基づくフィッティング曲線 (fit) がラインプロットとして表示されます。

  • 右側のプロット:

    • 各ガウス基底関数 \(k\) に対応する係数 \(c_k\) の値がプロットされます。横軸が基底関数のインデックス \(i\)、縦軸が係数 \(c_i\) です。

プログラムは、このグラフウィンドウが表示された状態で一時停止し、ユーザーがコンソールで ENTER キーを押すまで待機します。

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

ridge_gaussian_basis.py は、以下の形式でコマンドラインから実行できます。

python ridge_gaussian_basis.py [infile] [nG] [wG] [lmda]

各引数の意味は以下の通りです。

  • [infile]: 入力データを含むExcelファイル (.xlsx) のパス。

    • 型: 文字列

    • デフォルト値: random-poly-Gauss.xlsx

  • [nG]: ガウス基底関数の数。

    • 型: 整数

    • デフォルト値: 51

  • [wG]: 各ガウス基底関数の幅。

    • 型: 浮動小数点数

    • デフォルト値: 0.3

  • [lmda]: リッジ回帰の正則化パラメータ \(\lambda\)

    • 型: 浮動小数点数

    • デフォルト値: 0.0 (通常の最小二乗法に相当)

引数は省略可能であり、省略された場合はデフォルト値が使用されます。ただし、引数を指定する場合は左から順に指定する必要があります。例えば、infile を指定せずに nG だけを指定することはできません(その場合、nG の値が infile として解釈されてしまいます)。

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

ここでは、いくつかの具体的な実行例と、その実行結果について説明します。 実行には、適切なフォーマットのExcelファイルがカレントディレクトリにあることを前提とします。

1. デフォルト設定で実行

最も基本的な実行方法で、すべての引数を省略します。

python ridge_gaussian_basis.py

実行結果の説明: このコマンドは、デフォルトの入力ファイル random-poly-Gauss.xlsx を読み込みます。ガウス基底関数の数は 51 個、その幅は 0.3、リッジパラメータ \(\lambda\)0.0 (正則化なし) でリッジ回帰が実行されます。 標準出力には、これらの設定パラメータ、読み込んだファイル名、リッジ回帰の内部で構築される行列 Sij とベクトル Si の内容、そして各ガウス基底関数の中心 x0 と計算された係数 ci の値が順次表示されます。 最終的に、matplotlib によって2つのプロットを含むGUIウィンドウが表示されます。左側のプロットには、random-poly-Gauss.xlsx から読み込まれた元のデータ点と、それらのデータにフィッティングされた曲線が重ねて描画されます。右側のプロットには、計算された51個のガウス基底関数の係数値が棒グラフまたは点として表示されます。プログラムはこのGUIウィンドウが開いた状態で一時停止し、「Press ENTER to terminate」というメッセージが表示されます。ユーザーがコンソールで ENTER キーを押すと、プログラムは終了し、GUIウィンドウも閉じます。

2. 異なるパラメータを指定して実行

入力ファイル、ガウス基底関数の数、幅、リッジパラメータを全て指定する例です。

python ridge_gaussian_basis.py my_data.xlsx 30 0.5 0.1

実行結果の説明: このコマンドは、my_data.xlsx という名前のファイルを読み込みます(もしファイルが存在しない場合、エラーが発生します)。ガウス基底関数の数は 30 個、幅は 0.5、リッジパラメータ \(\lambda\)0.1 に設定されてリッジ回帰が実行されます。 標準出力とGUIウィンドウの表示内容は、上記デフォルト実行の場合と同様ですが、各パラメータが指定された値に変更されています。特に、\(\lambda = 0.1\) の指定により、係数 \(c_i\) の絶対値が \(\lambda=0.0\) の場合と比較して小さくなる傾向が見られるかもしれません。これは、正則化によって係数の過度な変動が抑制されるためです。GUIウィンドウは同様に表示され、ユーザーの ENTER 入力で終了します。