はじめに
pythonからMatlabでつくった関数を読み込んで動かす方法を記述。
もうすでに記事にされている方がいるのですがWindows ver ということでご容赦願いたい。
想定する読者
- Matlab関数で書かれた資産をpythonで読み出して使いたい人
- WindowsOSの人
- pythonインストールは自力でできる人(pipなど)
今回は、matlabで用意した関数をoptunaと呼ばれるパラメータ探索手法を用いて、Matlabで定義した関数の最適値をpythonで探索するまでの一連の手順を記載します。
動作環境
Matlab R2022b
Windows 10
python 3.10 インストール済み想定
pip install optuna も実施済み
実施手順
- python用Matlab engine をpython上にインストールする。
python -m pip install matlabengine
- Matlab用関数を準備
簡単な2次関数の値を返す関数です。
function [c] = function_matlab(a,b)
c = (a-3)^2 + (b-0.5)^2;
end
- test用pythonを準備
ここでは、先程作成したfunction_matlab 関数をmatlab.engineを通して呼び出して、
その値を最小化するXとYを探索します。
xは-10から10の連続値、y はリストの中の値で最適値を探します。
import optuna
import matlab.engine
eng = matlab.engine.start_matlab()
def objective(trial):
x = trial.suggest_float('x', -10, 10)
y = trial.suggest_categorical('y', [-1, 0 , 0.3 , 0.6, 2])
c = eng.function_matlab(x,y)
return c
study = optuna.create_study()
study.optimize(objective, n_trials=100)
print(study.best_params)
- 上記pythonコードを実行します。その際にMatlab関数と、pythonソフトは同じフォルダに入れておいてください。
実行結果
100回の試行で x=2.99, y=0.3 がベストと探索できてます。
関数から考えて、x=3, y=0.5が関数の最小値なので、無事探索できてます。
またMatlab関数をpythonで読み出して 最適化できています。
[I 2023-01-22 12:10:36,995] Trial 98 finished with value: 1.3919151142684436 and parameters: {'x': 1.8372811542473204, 'y': 0.3}. Best is trial 96 with value: 0.04007151564978928.
[I 2023-01-22 12:10:37,018] Trial 99 finished with value: 0.45619130467454294 and parameters: {'x': 2.3548710945287423, 'y': 0.3}. Best is trial 96 with value: 0.04007151564978928.
{'x': 2.9915433073965483, 'y': 0.3}
終わりに
Matlabのツールボックスが充実してきているので、そのうちこんな面倒な使い方はしなくなるのでしょうが、自身の記憶保持も兼ねてメモを残しておきます。