RegressionLinear Predict ブロックの使用による応答の予測
この例では、RegressionLinear Predictブロックを Simulink® の応答予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みの回帰線形モデルを使用することにより、その観測値の予測された応答を返します。
回帰モデルの学習
次のモデルにより、10,000 個の観測値をシミュレートします。
は、10% の要素が非ゼロ標準正規である 10,000 行 1000 列のスパース行列です。
"e" は、平均が 0、標準偏差が 0.3 のランダムな正規誤差です。
rng("default") % For reproducibility n = 1e4; d = 1e3; nz = 0.1; X = sprandn(n,d,nz); Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1);
データの 90% が観測され、残りは見当たらないものと仮定します。現在の標本と将来の標本にデータを分割します。
c = cvpartition(n,Holdout=0.1); idxPrsnt = training(c); idxFtr = test(c); prsntX = X(idxPrsnt,:); prsntY = Y(idxPrsnt); ftrX = X(idxFtr,:); ftrY = Y(idxFtr);
線形回帰モデルに学習させます。
linearMdl = fitrlinear(prsntX,prsntY);
linearMdl
はRegressionLinear
モデルです。
Simulink モデルの作成
この例では、RegressionLinear Predictブロックを含む Simulink モデル slexRegressionLinearPredictExample.slx
が用意されています。この節の説明に従って、この Simulink モデルを開くことも、新しいモデルを作成することもできます。
Simulink モデル slexRegressionLinearPredictExample.slx
を開きます。
SimMdlName = "slexRegressionLinearPredictExample";
open_system(SimMdlName)
Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn
のコードを実行します。slexRegressionLinearPredictExample
のコールバック関数 PreLoadFcn
には、学習済みモデルの変数 linearMdl
がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn
は標本データを読み込み、線形モデルに学習させ、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn
を選択します。
新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、RegressionLinear Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを RegressionLinear Predict ブロックに接続します。
RegressionLinear Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。学習済みの線形モデルを含むワークスペース変数の名前を指定します。既定の変数名は linearMdl
です。[更新] ボタンをクリックします。ダイアログ ボックスの [学習済みの機械学習モデル] に、線形モデル linearMdl
の学習に使用されるオプションが表示されます。
Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。
time
— 観測値がモデルに入力された時点。この例では、期間に 0 ~nftrX - 1
の整数を含めます。ここで、nftrX
は入力データ内の標本の数です。方向は予測子データ内の観測値に対応しなければなりません。したがって、この場合はtime
が列ベクトルでなければなりません。signals
—values
フィールドとdimensions
フィールドが含まれている、入力データを説明する 1 行 1 列の構造体配列。values
は予測子データの行列、dimensions
は予測子変数の個数です。
スパース行列 ftrX
を非スパースのストレージ構造に変換した後の将来の行列の標本用に、関数full
を使用して適切な構造体配列を作成します。
[nftrX,p] = size(ftrX); inputStruct.time = (1:nftrX)' - 1; inputStruct.signals(1).values = full(ftrX); inputStruct.signals(1).dimensions = p;
ワークスペースから信号データをインポートするには、次を実行します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブで、[モデル設定] をクリック。
[データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに「
inputStruct
」と入力。[ソルバー] ペインの [シミュレーション時間] で、[終了時間] を
inputStruct.time(end)
に設定。[ソルバーの選択] で、[タイプ] をFixed-step
に、[ソルバー] をdiscrete (no continuous states)
に設定。[ソルバーの詳細] で、Fixed-step size
を 1 に設定。これらの設定により、inputStruct
の各標本についてのシミュレーションをモデルで実行できます。
詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。
モデルをシミュレートします。
sim(SimMdlName);
Inport ブロックでは、観測値を検出すると、その観測値を RegressionLinear Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。
参考
RegressionLinear Predict | RegressionLinear
| predict
| fitrlinear