Main Content

MATLAB Function ブロックの使用によるクラス ラベルの予測

この例では、ラベル予測用に MATLAB® Function ブロックを Simulink® モデルに追加する方法を示します。この MATLAB Function ブロックは、ストリーミング データを受け入れて、学習済みのサポート ベクター マシン (SVM) 分類モデルを使用することによりラベルと分類スコアを予測します。MATLAB Function ブロックの使用法の詳細については、Simulink での MATLAB Function ブロックを使用した MATLAB 関数の実装 (Simulink)を参照してください。

分類モデルの学習

この例では、ionosphere データ セットを使用します。これには、レーダー反射の品質 (Y) および予測子データ (X) が含まれます。レーダー反射の品質は良好 ('g') または不良 ('b') のいずれかです。

ionosphere データ セットを読み込みます。標本サイズを調べます。

load ionosphere
n = numel(Y)
n = 351

MATLAB Function ブロックで cell 配列を返すことはできません。レーダー反射が良好な場合は要素が 1、それ以外の場合は 0 である logical ベクトルに応答変数を変換します。

Y = strcmp(Y,'g');

レーダー反射は連続的に検出されるものとし、また、はじめの 300 個の観測値を入手しており、残りの 51 個はまだ入手していないとします。現在の標本と将来の標本にデータを分割します。

prsntX = X(1:300,:);
prsntY = Y(1:300);
ftrX = X(301:end,:);
ftrY = Y(301:end);

現在利用できるすべてのデータを使用して SVM モデルに学習をさせます。予測子データを標準化するよう指定します。

Mdl = fitcsvm(prsntX,prsntY,'Standardize',true);

Mdl は、線形 SVM モデルであるClassificationSVMオブジェクトです。線形 SVM モデルでは、新しい観測値のラベルを予測するための十分な情報が予測子の係数によって提供されます。サポート ベクターを削除することで、生成コードのメモリ使用量が少なくなります。関数discardSupportVectorsを使用して線形 SVM モデルからサポート ベクターを削除します。

Mdl = discardSupportVectors(Mdl);

saveLearnerForCoder の使用によるモデルの保存

コマンド ラインでは、Mdl を使用して新しい観測値について予測を行うことができます。しかし、コード生成用の関数で入力引数として Mdl を使用することはできません。

saveLearnerForCoderを使用して、関数内に読み込めるように Mdl を準備します。

saveLearnerForCoder(Mdl,'SVMIonosphere');

saveLearnerForCoderMdl をコンパクトにしてから MAT ファイル SVMIonosphere.mat に保存します。

MATLAB 関数の定義

レーダー反射が良好な品質であるかどうかを予測する svmIonospherePredict.m という名前の MATLAB 関数を定義します。関数は次の条件を満たさなければなりません。

  • コード生成命令 %#codegen を関数内に含める。

  • レーダー反射の予測子データを受け入れる。データは、行数以外は X と同等でなければなりません。

  • loadLearnerForCoderを使用して SVMIonosphere.mat を読み込む。

  • 予測されたラベルと、レーダー反射の品質を良好であると予測する分類スコア (つまり、陽性クラスのスコア) を返す。

function [label,score] = svmIonospherePredict(X) %#codegen
%svmIonospherePredict Predict radar-return quality using SVM model
%   svmIonospherePredict predicts labels and estimates classification
%   scores of the radar returns in the numeric matrix of predictor data X
%   using the compact SVM model in the file SVMIonosphere.mat.  Rows of X
%   correspond to observations and columns to predictor variables.  label
%   is the predicted label and score is the confidence measure for
%   classifying the radar-return quality as good.
%
% Copyright 2016 The MathWorks Inc.
Mdl = loadLearnerForCoder('SVMIonosphere');
[label,bothscores] = predict(Mdl,X);
score = bothscores(:,2);
end

メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、MATLAB で例のフォルダーが開きます。このフォルダーには、エントリポイント関数のファイルが含まれています。

Simulink モデルの作成

svmIonospherePredict.m にディスパッチする MATLAB Function ブロックを使用して Simulink モデルを作成します。

この例では、Simulink モデル slexSVMIonospherePredictExample.slx が用意されています。Simulink モデルを開きます。

SimMdlName = 'slexSVMIonospherePredictExample'; 
open_system(SimMdlName)

classifyIonosphereBeforeSim.png

Simulink モデルが Figure に表示されます。入力ノードでレーダー反射が検出されると、svmIonospherePredict.m にディスパッチする MATLAB Function ブロックにその観測値が送られます。ラベルとスコアを予測した後で、これらの値がワークスペースに返され、モデル内の値が一度に 1 つずつ表示されます。slexSVMIonospherePredictExample.slx を読み込む際、MATLAB は radarReturnInput という名前の必要なデータ セットも読み込みます。しかし、この例では必要なデータ セットを構築する方法を示します。

このモデルでは、次のフィールドが含まれている radarReturnInput という名前の構造体配列を入力データとして受け入れることを想定しています。

  • time - 観測値がモデルに入力された時点。この例では、0 ~ 50 の整数を期間に含めます。方向は予測子データ内の観測値に対応しなければなりません。したがって、この例の場合は time が列ベクトルでなければなりません。

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

将来のレーダー反射用に適切な構造体配列を作成します。

radarReturnInput.time = (0:50)';
radarReturnInput.signals(1).values = ftrX;
radarReturnInput.signals(1).dimensions = size(ftrX,2);

ここで名前を radarReturnInput から変更して、新しい名前をモデル内で指定できます。ただし、Simulink では、前述したフィールド名が構造体配列に含まれていると想定しています。

学習から取り分けておいたデータ、つまり radarReturnInput のデータを使用してモデルをシミュレートします。

sim(SimMdlName);

classifyIonosphereAfterSim.png

radarReturnInput 内のすべての観測値が一度に 1 つずつ処理された後で、モデルが Figure に表示されます。X(351,:) について予測されたラベルは 1、陽性クラスのスコアは 1.431 です。変数 toutyout および svmlogsout がワークスペースに表示されます。youtsvmlogsout は、予測したラベルおよびスコアが含まれている SimulinkData.Dataset オブジェクトです。詳細は、記録されたシミュレーション データのデータ形式 (Simulink)を参照してください。

シミュレーション データをシミュレーション ログから抽出します。

labelsSL = svmlogsout.getElement(1).Values.Data;
scoresSL = svmlogsout.getElement(2).Values.Data;

labelsSL は、予測したラベルが格納されている 51 行 1 列の数値ベクトルです。labelsSL(j) は、将来の標本におけるレーダー反射 j の品質が良好であると SVM モデルが予測した場合は 1、それ以外の場合は 0 になります。scoresSL は、陽性クラスのスコア、つまり判定境界からの符号付き距離が格納されている 51 行 1 列の数値ベクトルです。陽性スコアは予測したラベルの値 1 に、陰性スコアは 0 に対応します。

predictを使用してコマンド ラインでラベルと陽性クラスのスコアを予測します。

[labelCMD,scoresCMD] = predict(Mdl,ftrX);
scoresCMD = scoresCMD(:,2);

labelCMDscoresCMDlabelsSL および scoresSL に相応します。

slexSVMIonospherePredictExample が返した将来の標本の陽性クラスのスコアを、コマンド ラインで predict を呼び出すことにより得られたスコアと比較します。

err = sum((scoresCMD - scoresSL).^2);
err < eps
ans = logical
   1

スコアの集合間における偏差の二乗和は無視できる値です。

Simulink Coder™ のライセンスもある場合、Simulink の slexSVMIonospherePredictExample.slx またはコマンド ラインからslbuild (Simulink)を使用して C コードを生成できます。詳細は、モデル用 C コードの生成 (Simulink Coder)を参照してください。

参考

| | | (Simulink) |

関連するトピック