このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
knnsearch
入力データを使用して k 最近傍を探索
説明
は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して Idx
= knnsearch(X
,Y
,Name,Value
)Idx
を返します。たとえば、探索する最近傍の個数や、探索で使用する距離計量を指定できます。
例
最近傍の探索
年齢と体重に従って、Y
内の患者に最も似ている患者を hospital
データセット内で探索します。
hospital
データセットを読み込みます。
load hospital; X = [hospital.Age hospital.Weight]; Y = [20 162; 30 169; 40 168; 50 170; 60 171]; % New patients
X
と Y
の間で knnsearch
を実行して、最近傍のインデックスを求めます。
Idx = knnsearch(X,Y);
Y
内の患者に年齢と体重が最も近い患者を X
内で探索します。
X(Idx,:)
ans = 5×2
25 171
25 171
39 164
49 170
50 172
異なる距離計量を使用した k 最近傍の探索
最初にミンコフスキー距離計量を、次にチェビシェフ距離計量を使用して、Y
内の各点に対する 10 個の最近傍を X
内で探索します。
フィッシャーのアヤメのデータセットを読み込みます。
load fisheriris X = meas(:,3:4); % Measurements of original flowers Y = [5 1.45;6 2;2.75 .75]; % New flower data
ミンコフスキー距離計量とチェビシェフ距離計量を使用して、X
とクエリ点 Y
の間で knnsearch
を実行します。
[mIdx,mD] = knnsearch(X,Y,'K',10,'Distance','minkowski','P',5); [cIdx,cD] = knnsearch(X,Y,'K',10,'Distance','chebychev');
2 つの最近傍探索の結果を可視化します。学習データをプロットします。マーカー X でクエリ点をプロットします。円を使用してミンコフスキー最近傍を表します。星形五角形を使用してチェビシェフ最近傍を表します。
gscatter(X(:,1),X(:,2),species) line(Y(:,1),Y(:,2),'Marker','x','Color','k',... 'Markersize',10,'Linewidth',2,'Linestyle','none') line(X(mIdx,1),X(mIdx,2),'Color',[.5 .5 .5],'Marker','o',... 'Linestyle','none','Markersize',10) line(X(cIdx,1),X(cIdx,2),'Color',[.5 .5 .5],'Marker','p',... 'Linestyle','none','Markersize',10) legend('setosa','versicolor','virginica','query point',... 'minkowski','chebychev','Location','best')
入力引数
X
— 入力データ
数値行列
入力データ。数値行列を指定します。X
の行は観測値に、列は変数に対応します。
データ型: single
| double
Y
— クエリ点
数値行列
クエリ点。数値行列を指定します。Y
の行は観測値に、列は変数に対応します。Y
の列数は X
と同じでなければなりません。
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: knnsearch(X,Y,'K',10,'IncludeTies',true,'Distance','cityblock')
は、市街地距離を使用して、同順位を含む 10 個の最近傍を探索します。
IncludeTies
— すべての最近傍を含むというフラグ
false
(0
) (既定値) | true
(1
)
クエリ点から同じ距離にあるすべての最近傍を含むというフラグ。'IncludeTies'
と false
(0
) または true
(1
) から構成されるコンマ区切りのペアとして指定します。
'IncludeTies'
が false
の場合、knnsearch
はクエリ点から同じ距離にある観測値の中でインデックスが最も小さいものを選択します。
'IncludeTies'
が true
の場合、次のようになります。
例: 'IncludeTies',true
NSMethod
— 最近傍探索法
'kdtree'
| 'exhaustive'
最近傍探索法。'NSMethod'
と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。
例: 'NSMethod','exhaustive'
Distance
— 距離計量
'euclidean'
(既定値) | 'seuclidean'
| 'cityblock'
| 'chebychev'
| 'minkowski'
| 'mahalanobis'
| 関数ハンドル | ...
knnsearch
が使用する距離計量。'Distance'
と次の表のいずれかの値または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'euclidean' | ユークリッド距離。 |
'seuclidean' | 標準化されたユークリッド距離。X の行とクエリ行列 Y の行の間の各座標差は、X から計算される、対応する標準偏差の要素で除算することによりスケーリングされます。他のスケーリングを指定するには、名前と値のペアの引数 'Scale' を使用します。 |
'cityblock' | 市街地距離。 |
'chebychev' | チェビシェフ距離 (最大座標差)。 |
'minkowski' | ミンコフスキー距離。既定の指数は 2 です。別の指数を指定するには、'P' 名前と値のペアの引数を使用します。 |
'mahalanobis' | 正定値共分散行列を使用して計算されるマハラノビス距離。共分散行列の値を変更するには、名前と値のペアの引数 'Cov' を使用します。 |
'cosine' | 1 から、ベクトルとして扱われる観測間の夾角の余弦を引きます。 |
'correlation' | 1 から、一連の値として扱われる観測間の標本線形相関係数を引きます。 |
'spearman' | 1 から、観測値間の標本スピアマンの順位相関 (値の系列として扱われる) を引いた値。 |
'hamming' | 異なる座標の比率を示すハミング距離。 |
'jaccard' | 1 から、ジャカード係数 (異なる非ゼロ座標の比率) を引いた値。 |
@distfun
のように @
を使用すると、カスタム距離計量用の関数ハンドルを指定することもできます。カスタムな距離関数は、次のようになっていなければなりません。
function D2 = distfun(ZI,ZJ)
という形式になっている。次の引数を受け入れる。
X
またはクエリ点Y
の 1 行が含まれている 1 行 n 列のベクトルZI
。X
またはY
の複数行が含まれている m2 行 n 列の行列ZJ
。
j
番目の要素が観測値ZI
およびZJ(j,:)
の間の距離になっている、m2 行 1 列の距離のベクトルD2
を返す。
詳細は、距離計量を参照してください。
例: 'Distance','chebychev'
P
— ミンコフスキー距離計量の指数
2
(既定値) | 正のスカラー
ミンコフスキー距離計量の指数。'P'
と正のスカラー値をコンマで区切って指定します。
この引数は、'Distance'
が 'minkowski'
である場合のみ有効です。
例: 'P',3
データ型: single
| double
Cov
— マハラノビス距離計量の共分散行列
cov(X,'omitrows')
(既定値) | 正定値行列
マハラノビス距離計量の共分散行列。'Cov'
と正定値行列から構成されるコンマ区切りのペアとして指定します。
この引数は、'Distance'
が 'mahalanobis'
である場合のみ有効です。
例: 'Cov',eye(4)
データ型: single
| double
Scale
— 標準化されたユークリッド距離計量のスケール パラメーター値
std(X,'omitnan')
(既定値) | 非負の数値ベクトル
標準化されたユークリッド距離計量のスケール パラメーター値。'Scale'
と非負の数値ベクトルから構成されるコンマ区切りのペアとして指定します。'Scale'
の長さは X
の列数と同じにします。標準化されたユークリッド距離を knnsearch
で計算するときに、X
の各座標と各クエリ点が 'Scale'
の対応する要素によってスケーリングされます。この引数は、'Distance'
が 'seuclidean'
である場合のみ有効です。
例: 'Scale',quantile(X,0.75) - quantile(X,0.25)
データ型: single
| double
BucketSize
— Kd 木の葉ノードにおけるデータ点の最大数
50
(既定値) | 正の整数
Kd 木の葉ノードにおけるデータ点の最大数。'BucketSize'
と正の整数から構成されるコンマ区切りのペアとして指定します。この引数は、NSMethod
が 'kdtree'
である場合のみ有効です。
例: 'BucketSize',20
データ型: single
| double
SortIndices
— 返されたインデックスを距離に従って並べ替えるためのフラグ
true
(1
) (既定値) | false
(0
)
返されたインデックスを距離に従って並べ替えるためのフラグ。'SortIndices'
と true
(1
) または false
(0
) から構成されるコンマ区切りのペアとして指定します。
以下の場合は、SortIndices
を false
に設定して速度を向上させることができます。
NSMethod
が'kdtree'
。IncludeTies
がfalse
。
この場合、knnsearch
が返す最近傍のインデックスに特定の順序はありません。SortIndices
が true
である場合、最近傍のインデックスは距離の昇順で並べ替えられます。
既定では、SortIndices
は true
です。NSMethod
が 'exhaustive'
であるか、IncludeTies
が true
である場合、常にインデックスが並べ替えられます。
例: 'SortIndices',false
データ型: logical
出力引数
Idx
— 最近傍の入力データのインデックス
数値行列 | 数値ベクトルの cell 配列
最近傍の入力データのインデックス。数値行列、または数値ベクトルの cell 配列として返されます。
IncludeTies
(既定はfalse
) を指定しなかった場合、Idx
は m 行 k 列の数値行列になります。m はY
の行数、k は探索対象の最近傍の個数です。Idx(j,i)
は、X(Idx(j,i),:)
がクエリ点Y(j,:)
に対して最も近いX
内の k 個の観測値の 1 つであることを示します。'IncludeTies',true
を指定した場合、Idx
は m 行1
列の cell 配列になり、クエリ点Y(j,:)
に最も近いX
内の観測値のインデックスが少なくとも k 個含まれているベクトルがセルj
(Idx{j}
) に格納されます。
SortIndices
が true
である場合、knnsearch
はインデックスを距離の昇順で並べ替えます。
D
— 最近傍の距離
数値行列 | 数値ベクトルの cell 配列
クエリ点に対する最近傍の距離。数値行列、または数値ベクトルの cell 配列として返されます。
IncludeTies
(既定はfalse
) を指定しなかった場合、D
は m 行 k 列の数値行列になります。m はY
の行数、k は探索対象の最近傍の個数です。D(j,i)
は、距離計量によるX(Idx(j,i),:)
とY(j,:)
の間の距離です。'IncludeTies',true
を指定した場合、D
は m 行1
列の cell 配列になり、クエリ点Y(j,:)
に最も近いX
内の観測値の距離が少なくとも k 個含まれているベクトルがセルj
(D{j}
) に格納されます。
SortIndices
が true
である場合、knnsearch
は距離を昇順で並べ替えます。
ヒント
knnsearch
は、一定の正の整数 k について、Y
内の各点に最も近い k 個の点をX
内で探索します。Y
内の各点から一定距離以内にあるすべての点をX
内で探索するには、rangesearch
を使用します。knnsearch
は、探索オブジェクトを保存しません。探索オブジェクトを作成するには、createns
を使用します。
アルゴリズム
特定の検索アルゴリズムの詳細は、k 最近傍探索および半径探索を参照してください。
代替機能
関数 knnsearch
の名前と値のペアの引数 'NSMethod'
を適切な値 (網羅的探索アルゴリズムの場合は 'exhaustive'
、Kd 木アルゴリズムの場合は 'kdtree'
) に設定した場合、オブジェクト関数 knnsearch
を使用して距離探索を実行することにより得られる結果と同じ探索結果になります。関数 knnsearch
とは異なり、オブジェクト関数 knnsearch
では ExhaustiveSearcher
または KDTreeSearcher
モデル オブジェクトが必要です。
参照
[1] Friedman, J. H., J. Bentley, and R. A. Finkel. “An Algorithm for Finding Best Matches in Logarithmic Expected Time.” ACM Transactions on Mathematical Software 3, no. 3 (1977): 209–226.
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
使用上の注意事項および制限事項:
X
が tall 配列の場合、Y
を tall 配列にすることはできません。同様に、Y
が tall 配列の場合、X
を tall 配列にすることはできません。
詳細は、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
コード生成では、
X
の列数が 7 より多い場合、名前と値のペアの引数'NSMethod'
の既定値は'exhaustive'
です。名前と値のペアの引数
'Distance'
の値はコンパイル時の定数でなければならず、カスタム距離関数にすることはできません。名前と値のペアの引数
'IncludeTies'
の値は、コンパイル時の定数でなければなりません。名前と値のペアの引数
'SortIndices'
はサポートされていません。出力引数は常に並べ替えられます。名前と値の引数に含まれる名前はコンパイル時の定数でなければなりません。たとえば、生成されたコードでミンコフスキー距離についてユーザー定義の指数を使用可能にするには、
{coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0}
をcodegen
(MATLAB Coder) の-args
の値に含めます。'IncludeTies'
にtrue
を指定した場合、数値精度のために、生成コード内の同順位の距離の並び順が MATLAB® の順序と異なる可能性があります。knnsearch
が kd 木探索アルゴリズムを使用し、コード生成のビルド タイプが MEX 関数である場合、codegen
(MATLAB Coder) は並列計算用に Intel® スレッディング ビルディング ブロック (TBB) を使用して MEX 関数を生成します。それ以外の場合、codegen
はparfor
(MATLAB Coder) を使用してコードを生成します。kd 木探索アルゴリズムの場合の MEX 関数 —
codegen
は、マルチコア プラットフォームにおける並列計算用に Intel TBB を使用して、最適化された MEX 関数を生成します。この MEX 関数を使用して MATLAB アルゴリズムを高速化できます。Intel TBB の詳細については、https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.htmlを参照してください。生成された
parfor
バージョンのコードをテストするために MEX 関数を生成する場合、Intel TBB の使用を無効化できます。MEX 構成オブジェクトのExtrinsicCalls
プロパティをfalse
に設定します。詳細については、coder.MexCodeConfig
(MATLAB Coder) を参照してください。網羅的探索アルゴリズムの場合の MEX 関数と、両方のアルゴリズムの場合のスタンドアロン C/C++ コード — 生成される
knnsearch
のコードでは、parfor
(MATLAB Coder) を使用して、サポートされている共有メモリ マルチコア プラットフォームで並列的に動作するループが作成されます。コンパイラが Open Multiprocessing (OpenMP) アプリケーション インターフェイスをサポートしない場合、または OpenMP ライブラリを無効にした場合、MATLAB Coder™ はparfor
ループをfor
ループとして扱います。サポートされるコンパイラについては、サポートされるコンパイラを参照してください。OpenMP ライブラリを無効にするには、構成オブジェクトのEnableOpenMP
プロパティをfalse
に設定します。詳細については、coder.CodeConfig
(MATLAB Coder) を参照してください。
R2020a 以降は、
knnsearch
は、生成されたスタンドアロン C/C++ コードにおいて、倍精度のインデックスではなく、整数型 (int32
) のインデックスを返します。そのため、関数は、単精度の入力を使用する場合、厳密な単精度のサポートを可能にします。MEX コード生成では、関数は依然として MATLAB の動作に一致する倍精度のインデックスを返します。
コード生成の詳細については、コード生成の紹介および一般的なコード生成のワークフローを参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
名前と値のペアの引数
'IncludeTies'
、'NSMethod'
および'SortIndices'
はサポートされていません。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2010a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)