メインコンテンツ

Simulink でのカスタム Python モデルを使用した応答の予測

この例では、Custom Python Model Predictブロックを Simulink® での予測に使用する方法を示します。このブロックは、観測値 (予測子データとノイズを含む応答で構成) を受け入れて、それを予測用に構成されたカスタム Python® モデルに送ります。ブロックは Python でカスタム モデルを実行し、観測値についての予測応答と平均二乗誤差を返します。

MATLAB® は、Python の参照実装 (通称 CPython) をサポートします。Mac または Linux® プラットフォームを使用している場合、Python は既にインストールされています。Windows® を使用している場合、"https://www.python.org/downloads/" などにある配布版をインストールする必要があります。詳細については、Python を使用するためのシステムの構成を参照してください。

Custom Python Model Predict ブロックには、load_model() 関数と predict() 関数を定義するカスタム Python モデルが必要です。この例では、保存されたモデル custom.py が用意されており、このモデルで 2 つの予測子をもつ多重線形回帰モデルの係数を読み込む load_model() 関数、入力観測値についての予測応答と平均二乗誤差を返す predict() 関数が定義されています。

用意されている Simulink モデルを開く

この例では、Custom Python Model Predict ブロックを含む Simulink モデル slexCustomPythonModelPredictExample.slx が用意されています。この Simulink モデルを開くことも、次のセクションの説明に従って新しいモデルを作成することもできます。

Simulink モデル slexCustomPythonModelPredictExample.slx を開きます。

open_system("slexCustomPythonModelPredictExample");

CustomExample.png

Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn のコードを実行します。slexCustomPythonModelPredictExample のコールバック関数 PreLoadFcn には、学習済みモデルの変数 Xin がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn は標本観測値を生成し、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn を選択します。

Simulink モデルの作成

新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、Statistics and Machine Learning Toolbox™ ライブラリから Custom Python Model Predict ブロックを追加します。

Custom Python Model Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[load_model() と predict() を定義する Python ファイルへのパス] テキスト ボックスに「custom.py」と入力します。

[load_model() の引数] テキスト ボックスに「1,2,-3」と入力して、Python モデルに渡すモデルの係数を指定します。

[入力] タブで [新規] をクリックして Custom Python Model Predict ブロックに 2 番目の入力端子を追加します。

[出力] タブで [新規] をクリックして 2 番目の出力端子を追加します。[OK] をクリックします。

From Workspace ブロックを 2 つ追加して、それらを Custom Python Model Predict ブロックの入力端子に接続します。

1 つ目の From Workspace ブロックをダブルクリックします。[パラメーター] セクションの [データ] に「Xin」と入力します。[サンプル時間 (継承は -1)] に「1」と入力します。[OK] をクリックします。

2 つ目の From Workspace ブロックをダブルクリックします。[パラメーター] セクションの [データ] に「Yin」と入力します。[サンプル時間 (継承は -1)] に「1」と入力します。[OK] をクリックします。

Outport ブロックを 2 つ追加して、それらを Custom Python Model Predict ブロックの出力端子に接続します。

MATLAB ワークスペースで 100 個の観測値から構成されるデータ セットを生成します。各観測値は 2 つの予測子 (X) と 1 つの応答 (y) で構成されます。ノイズを含む応答をシミュレートするには、カスタム Python モデルと同じ線形回帰係数を使用して応答を生成し、ランダムなガウス ノイズを追加します。

rng(0,"twister") % For reproducibility
n = 100;
X = rand(n,2);
beta = [1,2,-3];
y = randn(n,1) + beta(1)*ones(n,1) + beta(2)*X(:,1) + beta(3)*X(:,2);

Simulink モデルの入力信号を作成します。

time = (0:n-1)';
Xin = [time,X];
Yin = [time,y];

ワークスペースから信号データをインポートします。

  • [コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブで、[モデル設定] をクリック。

  • ダイアログ ボックスの左側で [ソルバー] をクリック。[シミュレーション時間][終了時間]size(Yin,1)-1 に設定。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定。[OK] をクリックします。

詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。

モデルを Simulink で slexCustomPythonModelPredictExample.slx として保存します。

Simulink モデルのシミュレート

Simulink モデルをシミュレートして、入力観測値に対する応答を予測します。

simOut=sim("slexCustomPythonModelPredictExample");

Custom Python Model Predict ブロックは、観測値を検出すると、その予測子データを Python または NumPy のデータ型に変換します。[ブロック パラメーター] ダイアログ ボックスの [入力] タブにある [Python データ型] 列で指定されたデータ型です。その後、ブロックは予測子データとノイズを含む応答を Python に渡し、カスタム Python の predict() 関数が観測値についての予測応答と平均二乗誤差を返します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

モデルの予測誤差の可視化

平均二乗誤差の値をプロットします。

mse = squeeze(simOut.yout.getElement(2).Values.data);
plot(mse,marker="+")
xlabel("Observation")
ylabel("MSE")

Figure contains an axes object. The axes object with xlabel Observation, ylabel MSE contains an object of type line.

各観測値について、ノイズを含む入力応答と予測モデル応答との間の平均二乗差がプロットに表示されます。

参考

|