最近傍探索モデルのコード生成
最近傍探索モデル オブジェクト ExhaustiveSearcher
および KDTreeSearcher
のオブジェクト関数 knnsearch
および rangesearch
は、コード生成をサポートします。この例では、コマンド ラインで網羅的探索オブジェクトを使用して最近傍を探索するためのコードを生成する方法を示します。この例では、オブジェクトを使用する方法に応じて、コードを生成するための 2 つの異なる方法を示します。1 つは、エントリポイント関数でloadLearnerForCoder
を使用してオブジェクトを読み込むという方法で、もう 1 つは、生成されたコードにコンパイル時の定数であるオブジェクトを渡すという方法です。
網羅的最近傍探索モデルの学習
フィッシャーのアヤメのデータセットを読み込みます。
load fisheriris
クエリ セットとして使用するため、5 つのアヤメのデータを無作為に予測子データから抽出します。
rng('default'); % For reproducibility n = size(meas,1); % Sample size qIdx = randsample(n,5); % Indices of query data X = meas(~ismember(1:n,qIdx),:); Y = meas(qIdx,:);
学習データを使用して網羅的最近傍探索モデルを準備します。最近傍の探索に指数 1 のミンコフスキー距離を使用するように、名前と値のペアの引数 'Distance'
および 'P'
を指定します。
Mdl = ExhaustiveSearcher(X,'Distance','minkowski','P',1);
クエリ データ (Y
) 内の各点の最近傍であるような学習データ (X
) のインデックスを探索します。
Idx = knnsearch(Mdl,Y);
saveLearnerForCoder
と loadLearnerForCoder
の使用によるコードの生成
網羅的探索モデルを読み込むコードを生成し、クエリ データを入力引数として受け入れ、最近傍を探索します。
saveLearnerForCoder
を使用して網羅的探索モデルをファイルに保存します。
saveLearnerForCoder(Mdl,'searcherModel')
saveLearnerForCoder
は、現在のフォルダーの MATLAB® バイナリ ファイル searcherModel.mat
に構造体配列としてモデルを保存します。
クエリ データを入力引数として受け入れるエントリポイント関数 myknnsearch1
を定義します。この関数では、loadLearnerForCoder
を使用して探索オブジェクトを読み込んで knnsearch
に渡します。
type myknnsearch1.m % Display contents of myknnsearch1.m file
function idx = myknnsearch1(Y) %#codegen Mdl = loadLearnerForCoder('searcherModel'); idx = knnsearch(Mdl,Y); end
メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、MATLAB で例のフォルダーが開きます。このフォルダーには、エントリポイント関数のファイル myknnsearch1.m
、myknnsearch2.m
、および myknnsearch3.m
が含まれています。
codegen
(MATLAB Coder)を使用して myknnsearch1
のコードを生成します。生成されるコードが可変サイズの配列を受け入れるようにするため、coder.typeof
(MATLAB Coder) を使用して入力引数のデータ型と次元を指定します。
codegen myknnsearch1 -args {coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.
saveLearnerForCoder
および loadLearnerForCoder
を使用するコード生成の詳細な例については、機械学習モデルの予測をコマンド ラインで行うコードの生成を参照してください。可変サイズの引数の指定に関する詳細については、コード生成用の可変サイズ引数の指定を参照してください。
クエリ データ (Y
) を渡して、同じインデックスを myknnsearch1
と MEX ファイルが返すかどうかを確認します。
myIdx1 = myknnsearch1(Y); myIdx1_mex = myknnsearch1_mex(Y);
isequal
を使用して、myIdx1
と myIdx1_mex
を比較します。
verifyMEX1 = isequal(Idx,myIdx1,myIdx1_mex)
verifyMEX1 = logical
1
すべての入力が等しい場合、isequal
は logical 1 (true
) を返します。この比較により、同じ結果を myknnsearch1
と MEX ファイルが返すことを確認します。
定数畳み込みされたモデル オブジェクトによるコード生成
最近傍探索モデル オブジェクトは、コード生成用に定義した関数の入力引数にすることができます。codegen
(MATLAB Coder) の -args
オプションは、コンパイル時の定数である探索モデル オブジェクトを受け入れます。
関数内でモデルを読み込むのではなく、網羅的探索モデルとクエリ データの両方を入力引数として受け入れるエントリポイント関数 myknnsearch2
を定義します。
type myknnsearch2.m % Display contents of myknnsearch2.m file
function idx = myknnsearch2(Mdl,Y) %#codegen idx = knnsearch(Mdl,Y); end
クエリ データだけでなくモデル オブジェクトも受け入れるコードを生成するには、coder.Constant
(MATLAB Coder) を使用してモデル オブジェクトをコンパイル時の定数として指定し、定数畳み込みされたモデル オブジェクトを codegen
の -args
の値に含めます。
codegen myknnsearch2 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.
定数畳み込みされたモデル オブジェクトによるコード生成ワークフローは、一般的なコード生成ワークフローに従います。詳細については、一般的なコード生成のワークフロー を参照してください。
同じラベルを myknnsearch2
と MEX ファイルが返すことを確認します。
myIdx2 = myknnsearch2(Mdl,Y); myIdx2_mex = myknnsearch2_mex(Mdl,Y); verifyMEX2 = isequal(Idx,myIdx2,myIdx2_mex)
verifyMEX2 = logical
1
名前と値のペアの引数によるコードの生成
モデル オブジェクト、クエリ データおよび名前と値のペアの引数を受け入れるエントリポイント関数 myknnsearch3
を定義します。入力引数として varargin を指定することにより、オプションの名前と値のペアの引数に対応できます。詳細については、可変長引数リストのコード生成 (MATLAB Coder)を参照してください。
type myknnsearch3.m % Display contents of myknnsearch3.m file
function idx = myknnsearch3(Mdl,Y,varargin) %#codegen idx = knnsearch(Mdl,Y,varargin{:}); end
ミンコフスキー距離についてユーザー定義の指数を受け入れるコードを生成するには、{coder.Constant('P'),0}
を codegen
の -args
の値に含めます。名前と値のペアの引数の名前はコンパイル時の定数でなければならないので、coder.Constant
(MATLAB Coder) を使用します。
codegen myknnsearch3 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0]),coder.Constant('P'),0}
Code generation successful.
同じラベルを myknnsearch3
と MEX ファイルが返すことを確認します。
newIdx = knnsearch(Mdl,Y,'P',2); myIdx3 = myknnsearch3(Mdl,Y,'P',2); myIdx3_mex = myknnsearch3_mex(Mdl,Y,'P',2); verifyMEX3 = isequal(newIdx,myIdx3,myIdx3_mex)
verifyMEX3 = logical
1
参考
codegen
(MATLAB Coder) | saveLearnerForCoder
| loadLearnerForCoder
| knnsearch
| rangesearch
| ExhaustiveSearcher
| KDTreeSearcher