Main Content

RegressionGP Predict ブロックの使用による応答の予測

この例では、RegressionGP Predictブロックを Simulink® の応答予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みのガウス過程 (GP) 回帰モデルを使用することにより、その観測値の予測された応答を返します。ブロックから応答の標準偏差と予測区間も返すことができます。

回帰モデルの学習

MATLAB® コマンド ラインで GP 回帰モデルに学習させ、予測応答と予測区間を計算します。

gprdata データ セットを読み込みます。このデータ セットにはシミュレートされた学習データとテスト データが含まれており、学習データには 500 個、テスト データには 100 個の観測値があります。データには 6 つの予測子変数があります。

load gprdata

学習データ Xtrain および ytrain を関数 fitrgp に渡して、GP 回帰モデルに学習させます。数値予測子を標準化するための指定を行います。

gpMdl = fitrgp(Xtrain,ytrain,Standardize=1)
gpMdl = 
  RegressionGP
             ResponseName: 'Y'
    CategoricalPredictors: []
        ResponseTransform: 'none'
          NumObservations: 500
           KernelFunction: 'SquaredExponential'
        KernelInformation: [1x1 struct]
            BasisFunction: 'Constant'
                     Beta: 304.8486
                    Sigma: 0.8235
        PredictorLocation: [6x1 double]
           PredictorScale: [6x1 double]
                    Alpha: [500x1 double]
         ActiveSetVectors: [500x6 double]
            PredictMethod: 'Exact'
            ActiveSetSize: 500
                FitMethod: 'Exact'
          ActiveSetMethod: 'Random'
        IsActiveSetVector: [500x1 logical]
            LogLikelihood: -770.2440
         ActiveSetHistory: []
           BCDInformation: []


gpMdlRegressionGPモデルです。ドット表記を使用して gpMdl のプロパティにアクセスできます。たとえば、gpMdl.TrainingHistory と指定すると、GP モデルの学習履歴についての詳細情報を表示できます。

予測 ypred と予測区間 yint を計算し、平方根平均二乗誤差 (RMSE) を計算します。

[ypred,~,yint] = predict(gpMdl,Xtest);
rmse = sqrt(mean((ypred-ytest).^2))
rmse = 
0.9166

真の応答、予測した応答および予測区間をプロットします。

hold on
plot(ytest)
plot(ypred)
plot(yint(:,1),"k:")
plot(yint(:,2),"k:")
hold off
legend("True Responses","GP Predictions",...
    "Prediction Intervals",Location="best")

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent True Responses, GP Predictions, Prediction Intervals.

モデル gpMdl に学習させたので、RegressionGP Predict ブロックにインポートできます。

Simulink モデルの作成

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

RegressionGP Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。モデルを含むワークスペース変数の名前を指定することにより、学習済みの RegressionGP モデルをブロックにインポートします。既定の変数名は gpMdl です。これは、コマンド ラインで学習させたモデルです。

[更新] ボタンをクリックして、ダイアログ ボックス内の学習済みモデルの設定を更新します。ダイアログ ボックスの [Trained Machine Learning Model] セクションに、モデル gpMdl の学習に使用されるオプションが表示されます。[Add output port for prediction intervals] チェック ボックスをオンにして、2 番目の出力端子 ("yint") をブロックに追加します。

RegressionGPblock.png

Inport ブロックを 1 つと Outport ブロックを 2 つ追加して、それらを RegressionGP Predict ブロックの入力と出力に接続します。

6 個の予測子変数をもつデータ セットを使用してモデルに学習させたため、RegressionGP Predict ブロックには 6 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 6 に設定します。出力信号を入力信号と同じ長さにする場合は、[サンプル時間] を 1 に設定します。

Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。

  • time — 観測値がモデルに入力された時点。方向は予測子データ内の観測値に対応しなければなりません。この例の場合は time が列ベクトルでなければなりません。

  • signalsvalues フィールドと dimensions フィールドが含まれている、入力データを説明する 1 行 1 列の構造体配列。values は予測子データの行列、dimensions は予測子変数の個数です。

将来の予測用に適切な構造体配列を作成します。詳細については、時間付き構造体 (Simulink)を参照してください。

modelInput.time = (0:length(ytest)-1)';
modelInput.signals(1).values = Xtest;
modelInput.signals(1).dimensions = size(Xtest,2);

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

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

  • [データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに「modelInput」と入力。

  • [ソルバー] ペインの [シミュレーション時間] で、[終了時間]modelInput.time(end) に設定。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定。

solver.png

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

Outport 1 ブロックをダブルクリックし、[メイン] タブで [信号名]ypred に設定します。同様に、Outport 2 ブロックをダブルクリックし、[信号名]yint に設定します。

指定されたモデルを開く

新しいモデルを作成する代わりに、用意されている Simulink モデル slexRegressionGPPredictExample.slx を開くことができます。このモデルに RegressionGP Predict ブロックが含まれています。このモデルにアクセスするには、例をライブ スクリプトとして開く必要があります。

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

SimMdlName = "slexRegressionGPPredictExample"; 
open_system(SimMdlName)

RegressionGPModel.png

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

Simulink モデルのシミュレート

Simulink モデルをシミュレートし、シミュレーション出力をワークスペースにエクスポートします。Inport ブロックでは、観測値を検出すると、その観測値を RegressionGP Predict ブロックに配置します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

simOut = sim(SimMdlName)
simOut = 
  Simulink.SimulationOutput:
                   tout: [100x1 double] 
                   yout: [1x1 Simulink.SimulationData.Dataset] 

     SimulationMetadata: [1x1 Simulink.SimulationMetadata] 
           ErrorMessage: [0x0 char] 

シミュレートされた予測と予測区間を調べ、シミュレートされた予測の RMSE を計算します。

outputs = simOut.yout;
sim_ypred = outputs.get("ypred").Values.Data;
sim_yint = outputs.get("yint").Values.Data;
sim_rmse = sqrt(mean((sim_ypred-ytest).^2))
sim_rmse = 
0.9166

真の応答、シミュレートされた予測、およびシミュレートされた予測区間をプロットします。

hold on
plot(ytest,"b")
plot(sim_ypred,"r")
plot(sim_yint(:,1),"k:")
plot(sim_yint(:,2),"k:")
hold off
legend("True Responses","Simulated GP Predictions",...
    "Simulated Prediction Intervals",Location="best")

Figure contains an axes object. The axes object contains 8 objects of type line. These objects represent True Responses, Simulated GP Predictions, Simulated Prediction Intervals.

プロットは、関数 predict の出力を使用して作成したプロットと同じようになります。

参考

関連するトピック