optimize_peakfit.py 技術ドキュメント

プログラムの動作

optimize_peakfit.py は、複数のピークを含む実験データに対して、非線形最小二乗法を用いたフィッティングを実行し、ピークの特性(位置、高さ、幅など)を定量的に解析するためのPythonプログラムです。

主な機能:

  • データ入出力: Excel形式のデータファイルやINI形式の設定ファイルを読み込み、ログファイルや結果ファイルを生成します。

  • 初期パラメータ推定: データの前処理(平滑化)を行い、線形最小二乗法を用いてピークの初期パラメータを自動的に推定します。

  • 多重ピークフィッティング: 推定された初期値に基づき、非線形最適化アルゴリズム(SciPyのminimize関数を使用)を用いて、データに最もよく適合する多重ピークモデルのパラメータを決定します。

  • 多様な最適化モード: 標準のフィッティングに加え、LASSO回帰、多変量線形回帰 (MLR) など、様々な最適化手法をサポートします。

  • 結果の可視化: フィッティング結果や入力データをプロットし、視覚的に確認できます。

  • 履歴管理: フィッティング過程のパラメータ変化などを履歴ファイルとして保存します。

  • デーモン/nohupモード: バックグラウンドでの実行や、ターミナル切断後もプロセスを継続するモードをサポートします。

解決する課題:

科学・工学分野におけるスペクトルデータやクロマトグラムデータなど、複数の成分が重なり合った複雑なピーク形状を持つデータを、各成分のピーク関数に分解し、個々の成分の物理的・化学的特性を正確に評価することを目的とします。ノイズの多いデータに対しても、ロバストなフィッティングとパラメータ推定を可能にします。

原理

optimize_peakfit.py は、与えられたデータセット \((x_i, y_i)\) に対して、複数のピーク関数を組み合わせたモデル関数 \(f(x; \vec{p})\) を最小二乗法により適合させます。ここで、\(x_i\) は独立変数(例: 波長、時間)、\(y_i\) は従属変数(例: 強度)、\(\vec{p}\) はフィッティングパラメータのベクトルを表します。

1. 平滑化と初期パラメータ推定

入力データは、まずSavitzky-Golayフィルター (scipy.signal.savgol_filter) によって平滑化されます。このフィルターは、移動窓内でデータを多項式で近似することで、ノイズを低減しながら元のピーク形状を保持する特徴があります。

その後、omodel.build_fit_params を通じて、平滑化されたデータからピーク位置や高さの初期値を推定し、線形最小二乗法 (opt.linear_fit) により、より良い初期パラメータセットを導出します。

2. 多重ピークモデル

具体的なピーク関数(ガウス関数、ローレンツ関数など)は、内部モジュールである peakfit.py (omodelとしてインポート) で定義されていると推測されます。一般的な多重ピークモデルは、個々のピーク関数の線形結合として表現されます。例えば、\(N\) 個のガウス関数ピークを仮定する場合、モデル関数は以下のようになります。

\[f(x; \vec{p}) = \sum_{j=1}^{N} A_j \exp\left(-\frac{(x - \mu_j)^2}{2\sigma_j^2}\right)\]

ここで、\(A_j\) はピークの高さ、\( \mu_j \) はピークの中心位置、\( \sigma_j \) はピークの幅に関連するパラメータです。すべての \(A_j, \mu_j, \sigma_j\) がフィッティングパラメータ \(\vec{p}\) を構成します。

3. 非線形最適化

モデル関数 \(f(x; \vec{p})\) を観測データ \(y_i\) に適合させるために、残差平方和 \(S(\vec{p})\) を最小化します。

\[S(\vec{p}) = \sum_{i=1}^{M} (y_i - f(x_i; \vec{p}))^2\]

この目的関数 \(S(\vec{p})\) を最小化するパラメータ \(\vec{p}\) を見つけるために、scipy.optimize.minimize 関数が使用されます。これは、Nelder-Mead、BFGS、L-BFGS-Bなどの様々な最適化アルゴリズムを内部的に利用し、非線形最適化問題を解きます。プログラムは、opt.fit 関数を通じてこの最適化プロセスを実行します。

4. その他の最適化手法

  • LASSO: 線形モデルにおいて、L1正則化を導入することで、一部の係数を強制的にゼロに近づけ、スパースな解を導出する手法です。これにより、ピークの選択やモデルの単純化に寄与します。

  • MLR (Multiple Linear Regression): 多変量線形回帰。複数の独立変数と単一の従属変数の関係を線形モデルで記述し、回帰係数を推定します。

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

optimize_peakfit.py は、以下の非標準ライブラリに依存しています。

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

  • pandas: データ構造とデータ分析ツールを提供するライブラリ。

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

  • scipy: 科学技術計算ライブラリ。特に最適化 (scipy.optimize) と信号処理 (scipy.signal) の機能を使用します。

  • tklib: このプログラム固有のユーティリティ関数やクラスを集めたカスタムライブラリ。

numpy, pandas, matplotlib, scipypip を使ってインストールできます。

pip install numpy pandas matplotlib scipy

tklib のインストール方法:

tklib は、このプログラムが属するプロジェクト内で開発されたカスタムライブラリであるため、標準の pip コマンドではインストールできません。 エラーメッセージから判断すると、tklib ディレクトリがPythonの検索パス (sys.path) 上に存在する必要があります。具体的には、tklib パッケージがプログラム optimize_peakfit.py と同じディレクトリ構造内に配置されているか、または環境変数 PYTHONPATHtklib の親ディレクトリが追加されている必要があります。

推奨される配置は、optimize_peakfit.py と同じ階層、またはそのサブディレクトリに tklib パッケージ(tklib という名前のディレクトリ内に __init__.py やその他のモジュールを含む)を置くことです。 プログラムの起動時に、sys.path.append('.') が実行されるため、optimize_peakfit.py と同じディレクトリに tklib があれば自動的にインポートされます。

エラーメッセージ $ Add [tkProg]{os.sep}tklib{os.sep}python to PYTHONPATH variable は、tkProg/tklib/python のようなパスを PYTHONPATH に追加することで tklib を利用可能にできることを示唆しています。 例:

# Linux/macOS
export PYTHONPATH="/path/to/tkProg/tklib/python:$PYTHONPATH"
python optimize_peakfit.py ...

# Windows (コマンドプロンプト)
set PYTHONPATH="C:\path\to\tkProg\tklib\python;%PYTHONPATH%"
python optimize_peakfit.py ...

必要な入力ファイル

optimize_peakfit.py は主に以下の2種類の入力ファイルをサポートします。

  1. データファイル:

    • 形式: Excelファイル (.xlsx) が推奨されます。

    • 内容: フィッティングの対象となる生データを含みます。通常、1列目に独立変数(Xデータ)、2列目以降に従属変数(Yデータ)が格納されていることが期待されます。

    • 指定方法: コマンドライン引数 --infile <file_path.xlsx> で指定します。

  2. 設定ファイル:

    • 形式: INI形式またはカスタム設定ファイル形式 (.in, .ini, .prm) を使用します。

    • 内容: プログラムの動作モード、フィッティングに関する各種パラメータ(例: 平滑化のオプション、初期パラメータの制約、最適化アルゴリズムの設定)、入出力ファイル名などが記述されます。

    • 指定方法: コマンドライン引数 --infile <config_file.ini> で指定するか、データファイル名と同じディレクトリにデフォルトの設定ファイルが期待される場合があります。mk_config モードでテンプレート設定ファイルを生成することも可能です。

例 (データファイル data.xlsx):

X

Y1

Y2

1.0

10.2

5.1

2.0

25.5

8.3

3.0

40.1

12.0

...

...

...

生成される出力ファイル

プログラムは、実行モードや設定に応じて以下のファイルを生成します。

  • ログファイル:

    • ファイル名: 入力データファイル名に基づき、{filebody}.log の形式で生成されます(例: data.log)。

    • 内容: プログラムの実行過程、読み込まれたパラメータ、フィッティングの進行状況、警告、エラーメッセージなどが時系列で記録されます。

  • 履歴ファイル:

    • ファイル名: 入力データファイル名に基づき、{filebody}-history.xlsx の形式で生成されます(例: data-history.xlsx)。

    • 内容: フィッティングの各ステップにおけるパラメータ値、目的関数の値、収束情報などの詳細な履歴がExcel形式で保存されます。これにより、フィッティングの安定性や収束挙動を分析できます。

  • 結果ファイル:

    • ファイル名: フィッティング結果を保存する具体的なファイル名は、コードから直接読み取れませんが、save_data 関数が呼び出されていることから、フィッティングされたデータ、最終的なパラメータ、モデル関数などが、Excelまたはテキスト形式で保存されると推測されます。

    • 内容: 最適化されたピークパラメータ(位置、高さ、幅など)、フィッティングされたモデルデータ、残差などが含まれます。

  • 停止ファイル (stop):

    • ファイル名: 入力データファイル名に基づき、{dirname}/stop の形式で生成されます(例: data_directory/stop)。

    • 内容: プログラムの実行中にこのファイルが存在すると、プログラムは安全に停止する機構を持っている場合があります。通常はプログラムが開始時に削除し、ユーザーが手動で作成することで停止トリガーとして機能させることができます。

  • 設定ファイルテンプレート (arg_config.xlsx, fit_config.xlsx):

    • ファイル名: mk_config モードで実行された場合に生成されます。

    • 内容: プログラムが認識する引数やフィッティングパラメータのデフォルト値、説明などが記述されたExcelファイルで、ユーザーが設定ファイルを作成する際のテンプレートとして使用できます。

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

optimize_peakfit.py は、コマンドライン引数を通じて実行モードやパラメータを制御します。

基本的な実行コマンドの形式は以下の通りです。

python optimize_peakfit.py [OPTIONS] --infile <input_file>

主なオプション:

  • --infile <file_path>: 入力データファイル (.xlsx) または設定ファイル (.in, .ini, .prm) のパスを指定します。

  • --mode <mode_name>: 実行モードを指定します。以下のモードがサポートされています。

    • mk_config: 設定ファイルのテンプレート (arg_config.xlsx, fit_config.xlsx) を生成します。

    • init: 初期化を行い、線形フィッティングによる初期パラメータ推定を行います。

    • search: ピークの自動検出を行います。

    • lfit: 線形フィッティングのみを実行します。

    • fit: 非線形最適化によるフィッティングを実行します。

    • plot: 入力データをプロットします。

    • plot_history: 履歴ファイルをプロットします。

    • clean: 実行中の一時ファイルをクリーンアップします。

    • kill: 関連するPythonプロセスを終了します。

    • daemon: プログラムをバックグラウンド(デーモン)として実行します。

    • nohup: HUPシグナルを無視し、ターミナル切断後もプロセスを継続します。

    • --<param_name> <value>: フィッティングパラメータやプログラム設定(例: --nsmooth 5, --threshold 0.1)を直接コマンドラインで指定できます。これらのパラメータは、設定ファイルの内容やデフォルト値を上書きします。

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

1. 設定ファイルテンプレートの生成

arg_config.xlsxfit_config.xlsx という名前で、プログラムが使用する引数とフィッティングパラメータのテンプレートファイルを生成します。

python optimize_peakfit.py mk_config

実行結果の説明: 現在のディレクトリに、コマンドライン引数とフィッティングパラメータの詳細を記述したExcelファイルが2つ作成されます。これらを参考に、ユーザーは自分自身の設定ファイルを作成したり、利用可能なパラメータを確認したりできます。

2. データ入力のプロット

data.xlsx という名前の入力データファイルをプロットします。

python optimize_peakfit.py --infile data.xlsx --mode plot

実行結果の説明: data.xlsx に含まれるX-Yデータが matplotlib を使用してグラフウィンドウに表示されます。これにより、フィッティング前にデータの全体像やピークの存在を確認できます。

3. 線形フィッティングによる初期パラメータ推定

data.xlsx を使用して、線形フィッティングによる初期パラメータの推定と初期化を行います。

python optimize_peakfit.py --infile data.xlsx --mode init

実行結果の説明: プログラムは data.xlsx を読み込み、平滑化処理を行い、線形最小二乗法に基づいてピークの初期パラメータを計算します。これらのパラメータは、後続の非線形フィッティングの出発点となります。ログファイル(例: data.log)に処理の詳細と推定された初期パラメータが出力されます。

4. 非線形多重ピークフィッティングの実行

data.xlsx に対して、最適なピークパラメータを見つけるための非線形フィッティングを実行します。

python optimize_peakfit.py --infile data.xlsx --mode fit

実行結果の説明: プログラムは、init モードで得られた初期パラメータ(または設定ファイルで指定されたパラメータ)を基に、scipy.optimize.minimize を用いて多重ピークモデルをデータに適合させます。最適化の進行状況がコンソールとログファイル(data.log)に表示され、最終的なフィッティング結果と最適なパラメータが算出されます。フィッティングされたデータやパラメータは、必要に応じて結果ファイルや履歴ファイル (data-history.xlsx) に保存されます。

5. デーモンモードでのフィッティング実行

data.xlsx に対して、バックグラウンドでフィッティングを実行し、daemon.log に出力をリダイレクトします。

python optimize_peakfit.py --infile data.xlsx --mode fit --daemon 1

実行結果の説明: プログラムはバックグラウンドプロセスとして起動し、フィッティング処理を開始します。標準出力と標準エラー出力は daemon.log ファイルにリダイレクトされるため、ターミナルを閉じても処理は継続されます。フィッティングの完了後、結果は通常の出力ファイルに保存されます。