ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

最近傍探索モデルのコード生成

最近傍探索モデル オブジェクト ExhaustiveSearcher および KDTreeSearcher のオブジェクト関数 knnsearch および rangesearch は、コード生成をサポートします。この例では、コマンド ラインで網羅的探索オブジェクトを使用して最近傍を探索するためのコードを生成する方法を示します。この例では、オブジェクトを使用する方法に応じて、コードを生成するための 2 つの異なる方法を示します。1 つは、エントリポイント関数でloadCompactModelを使用してオブジェクトを読み込むという方法で、もう 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);

saveCompactModelloadCompactModel の使用によるコードの生成

網羅的探索モデルを読み込むコードを生成し、クエリ データを入力引数として受け入れ、最近傍を探索します。

saveCompactModelを使用して網羅的探索モデルをファイルに保存します。

saveCompactModel(Mdl,'searcherModel')

saveCompactModel は、現在のフォルダーの searcherModel.mat という MATLAB バイナリ ファイルに構造体配列としてモデルを保存します。

クエリ データを入力引数として受け入れるエントリポイント関数 myknnsearch1 を定義します。この関数では、loadCompactModelを使用して探索オブジェクトを読み込んで knnsearch に渡します。

type myknnsearch1.m % Display contents of myknnsearch1.m file
function idx = myknnsearch1(x) %#codegen
Mdl = loadCompactModel('searcherModel');
idx = knnsearch(Mdl,x);
end

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

codegenを使用して myknnsearch1 のコードを生成します。生成されるコードが可変サイズの配列を受け入れるようにするため、coder.typeof を使用して入力引数のデータ型と次元を指定します。

codegen myknnsearch1 -args {coder.typeof(Y,[Inf,4],[1,0])}

saveCompactModel および loadCompactModel を使用するコード生成の詳細な例については、機械学習モデルの予測をコマンド ラインで行うコードの生成を参照してください。可変サイズの引数の指定に関する詳細については、コード生成用の可変サイズ引数の指定を参照してください。

クエリ データ (Y) を渡して、同じインデックスを myknnsearch1 と MEX ファイルが返すかどうかを確認します。

myIdx1 = myknnsearch1(Y);
myIdx1_mex = myknnsearch1_mex(Y);

isequal を使用して、myIdx1myIdx1_mex を比較します。

verifyMEX1 = isequal(Idx,myIdx1,myIdx1_mex)
verifyMEX1 = logical
   1

すべての入力が等しい場合、isequal は logical 1 (true) を返します。この比較により、同じ結果を myknnsearch1 と MEX ファイルが返すことを確認します。

定数畳み込みされたモデル オブジェクトによるコード生成

最近傍探索モデル オブジェクトは、コード生成用に定義した関数の入力引数にすることができます。codegen-args オプションは、コンパイル時の定数である探索モデル オブジェクトを受け入れます。

関数内でモデルを読み込むのではなく、網羅的探索モデルとクエリ データの両方を入力引数として受け入れるエントリポイント関数 myknnsearch2 を定義します。

type myknnsearch2.m % Display contents of myknnsearch2.m file
function idx = myknnsearch2(Mdl,x) %#codegen
idx = knnsearch(Mdl,x);
end

クエリ データだけでなくモデル オブジェクトも受け入れるコードを生成するには、coder.Constant を使用してモデル オブジェクトをコンパイル時の定数として指定し、定数畳み込みされたモデル オブジェクトを codegen-args の値に含めます。

codegen myknnsearch2 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0])}

定数畳み込みされたモデル オブジェクトによるコード生成ワークフローは、一般的なコード生成ワークフローに従います。詳細については、一般的なコード生成のワークフロー を参照してください。

同じラベルを 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,x,varargin) %#codegen
idx = knnsearch(Mdl,x,varargin{:});
end

ミンコフスキー距離についてユーザー定義の指数を受け入れるコードを生成するには、{coder.Constant('P'),0}codegen-args の値に含めます。名前と値のペアの引数の名前はコンパイル時の定数でなければならないので、coder.Constant を使用します。

codegen myknnsearch3 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0]),coder.Constant('P'),0}

同じラベルを 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

参考

| | | | | |

関連するトピック