このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
pdist2
観測値の 2 つの集合間のペアワイズ距離
構文
説明
は、D
= pdist2(X,Y
,Distance
,DistParameter
)Distance
および DistParameter
で指定された尺度を使用して距離を返します。DistParameter
を指定できるのは、Distance
が 'seuclidean'
、'minkowski'
または 'mahalanobis'
である場合だけです。
は、前の構文の入力引数のいずれかと、名前と値のペアの引数 D
= pdist2(___,Name,Value
)'Smallest'
または 'Largest'
を使用して、追加オプションを指定します。
たとえば、以下のようにします。
D = pdist2(X,Y,Distance,'Smallest',K)
は、Distance
によって指定された尺度を使用して距離を計算し、Y
内の各観測値についてX
内の観測値に対するペアワイズ距離を最小のものからK
個、昇順で返します。D = pdist2(X,Y,Distance,DistParameter,'Largest',K)
は、Distance
およびDistParameter
によって指定された尺度を使用して距離を計算し、ペアワイズ距離を最大のものからK
個、降順で返します。
[
は行列 D
,I
] = pdist2(___,Name,Value
)I
も返します。行列 I
には、D
内の距離に対応する X
内の観測値のインデックスが格納されます。
例
ユークリッド距離の計算
3 つの観測値と 2 つの変数を使用して 2 つの行列を作成します。
rng('default') % For reproducibility X = rand(3,2); Y = rand(3,2);
ユークリッド距離を計算します。入力引数 Distance
の既定値は 'euclidean'
です。名前と値のペアの引数を使用せずにユークリッド距離を計算する場合、Distance
を指定する必要はありません。
D = pdist2(X,Y)
D = 3×3
0.5387 0.8018 0.1538
0.7100 0.5951 0.3422
0.8805 0.4242 1.2050
D(i,j)
は、X
内の観測値 i
と Y
内の観測値 j
の間のペアワイズ距離に対応します。
ミンコフスキー距離の計算
3 つの観測値と 2 つの変数を使用して 2 つの行列を作成します。
rng('default') % For reproducibility X = rand(3,2); Y = rand(3,2);
既定の指数 2 を使用してミンコフスキー距離を計算します。
D1 = pdist2(X,Y,'minkowski')
D1 = 3×3
0.5387 0.8018 0.1538
0.7100 0.5951 0.3422
0.8805 0.4242 1.2050
指数を 1 にしてミンコフスキー距離を計算します。これは市街地距離に等しくなります。
D2 = pdist2(X,Y,'minkowski',1)
D2 = 3×3
0.5877 1.0236 0.2000
0.9598 0.8337 0.3899
1.0189 0.4800 1.7036
D3 = pdist2(X,Y,'cityblock')
D3 = 3×3
0.5877 1.0236 0.2000
0.9598 0.8337 0.3899
1.0189 0.4800 1.7036
2 つの最小のペアワイズ距離の計算
3 つの観測値と 2 つの変数を使用して 2 つの行列を作成します。
rng('default') % For reproducibility X = rand(3,2); Y = rand(3,2);
Y
内の各観測値について X
内の観測値に対するペアワイズのユークリッド距離を最小のものから 2 つ求めます。
[D,I] = pdist2(X,Y,'euclidean','Smallest',2)
D = 2×3
0.5387 0.4242 0.1538
0.7100 0.5951 0.3422
I = 2×3
1 3 1
2 2 2
pdist2
は、Y
内の各観測値について X
内の観測値すべてに対する距離値を計算して比較することにより、最小の 2 つの距離を求めます。そして、D
の各列に格納されている距離を昇順で並べ替えます。I
には、D
内の距離に対応する X
内の観測値のインデックスが格納されます。
カスタム距離関数の使用による、欠損要素があるペアワイズ距離の計算
NaN
値がある座標を無視するカスタム距離関数を定義し、この関数を使用してペアワイズ距離を計算します。
3 つの観測値と 3 つの変数を使用して 2 つの行列を作成します。
rng('default') % For reproducibility X = rand(3,3) Y = [X(:,1:2) rand(3,1)]
X = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 Y = 0.8147 0.9134 0.9649 0.9058 0.6324 0.1576 0.1270 0.0975 0.9706
X と Y の初めの 2 列は同じです。X(1,1)
が欠損していると仮定します。
X(1,1) = NaN
X = NaN 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575
ハミング距離を計算します。
D1 = pdist2(X,Y,'hamming')
D1 = NaN NaN NaN 1.0000 0.3333 1.0000 1.0000 1.0000 0.3333
X
内の観測値 i
または Y
内の観測値 j
に NaN
値が含まれている場合、関数 pdist2
は i
と j
の間のペアワイズ距離として NaN
を返します。したがって、D1(1,1)、D1(1,2) および D1(1,3) は NaN
値になります。
NaN
値がある座標を無視してハミング距離を計算するカスタム距離関数 nanhamdist
を定義します。大量の観測値を処理する場合、データの座標に対してループ処理を行うことにより距離の計算を高速化できます。
function D2 = nanhamdist(XI,XJ) %NANHAMDIST Hamming distance ignoring coordinates with NaNs [m,p] = size(XJ); nesum = zeros(m,1); pstar = zeros(m,1); for q = 1:p notnan = ~(isnan(XI(q)) | isnan(XJ(:,q))); nesum = nesum + ((XI(q) ~= XJ(:,q)) & notnan); pstar = pstar + notnan; end D2 = nesum./pstar;
pdist2
の入力引数として関数ハンドルを渡すことにより、nanhamdist
で距離を計算します。
D2 = pdist2(X,Y,@nanhamdist)
D2 = 0.5000 1.0000 1.0000 1.0000 0.3333 1.0000 1.0000 1.0000 0.3333
既存クラスターへの新しいデータの割り当てと C/C++ コードの生成
kmeans
は、k-means クラスタリングを実行して、データを k 個のクラスターに分割します。新しいデータセットをクラスター化するときに、kmeans
を使用して、既存のデータと新しいデータが含まれる新しいクラスターを作成できます。関数 kmeans
は C/C++ コード生成をサポートするので、学習データを受け入れてクラスター化の結果を返すコードを生成してから、コードをデバイスに展開できます。このワークフローでは学習データを渡さなければなりませんが、サイズが非常に大きい可能性があります。デバイスのメモリを節約するため、kmeans
とpdist2
をそれぞれ使用して、学習と予測を分離することができます。
kmeans
を使用して MATLAB® でクラスターを作成し、生成されたコードで pdist2
を使用して新しいデータを既存のクラスターに割り当てます。コード生成用に、クラスターの重心位置と新しいデータセットを受け入れて最も近いクラスターのインデックスを返すエントリポイント関数を定義します。次に、エントリポイント関数のコードを生成します。
C/C++ コードの生成には MATLAB® Coder™ が必要です。
k-means クラスタリングの実行
3 つの分布を使用して、学習データセットを生成します。
rng('default') % For reproducibility X = [randn(100,2)*0.75+ones(100,2); randn(100,2)*0.5-ones(100,2); randn(100,2)*0.75];
kmeans
を使用して、学習データを 3 つのクラスターに分割します。
[idx,C] = kmeans(X,3);
クラスターとクラスター重心をプロットします。
figure gscatter(X(:,1),X(:,2),idx,'bgm') hold on plot(C(:,1),C(:,2),'kx') legend('Cluster 1','Cluster 2','Cluster 3','Cluster Centroid')
既存クラスターへの新しいデータの割り当て
検定データセットを生成します。
Xtest = [randn(10,2)*0.75+ones(10,2); randn(10,2)*0.5-ones(10,2); randn(10,2)*0.75];
既存のクラスターを使用して、検定データセットを分類します。pdist2
を使用して、各検定データ点から最も近い重心を求めます。
[~,idx_test] = pdist2(C,Xtest,'euclidean','Smallest',1);
gscatter
を使用して検定データをプロットします。idx_test
を使用して検定データにラベルを付けます。
gscatter(Xtest(:,1),Xtest(:,2),idx_test,'bgm','ooo') legend('Cluster 1','Cluster 2','Cluster 3','Cluster Centroid', ... 'Data classified to Cluster 1','Data classified to Cluster 2', ... 'Data classified to Cluster 3')
コードの生成
新しいデータを既存のクラスターに割り当てる C コードを生成します。C/C++ コードの生成には MATLAB® Coder™ が必要であることに注意してください。
重心位置と新しいデータを受け入れてから、pdist2
を使用して最も近いクラスターを求める、findNearestCentroid
という名前のエントリポイント関数を定義します。
MATLAB のアルゴリズムについてのコードを生成しようとしていることを指示するため、コンパイラ命令 %#codegen
(またはプラグマ) をエントリポイント関数のシグネチャの後に追加します。この命令を追加すると、コード生成時にエラーになる違反の診断と修正を MATLAB Code Analyzer が支援します。
type findNearestCentroid % Display contents of findNearestCentroid.m
function idx = findNearestCentroid(C,X) %#codegen [~,idx] = pdist2(C,X,'euclidean','Smallest',1); % Find the nearest centroid
メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB® で開くと、MATLAB® で例のフォルダーが開きます。このフォルダーには、エントリポイント関数のファイルが含まれています。
codegen
(MATLAB Coder)を使用してコードを生成します。C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。findNearestCentroid
の入力のデータ型と配列サイズを指定するため、-args
オプションを使用して、特定のデータ型および配列サイズをもつ一連の値を表す MATLAB 式を渡します。詳細については、コード生成用の可変サイズ引数の指定を参照してください。
codegen findNearestCentroid -args {C,Xtest}
Code generation successful.
codegen
は、プラットフォームに依存する拡張子をもつ MEX 関数 findNearestCentroid_mex
を生成します。
生成されたコードを検証します。
myIndx = findNearestCentroid(C,Xtest); myIndex_mex = findNearestCentroid_mex(C,Xtest); verifyMEX = isequal(idx_test,myIndx,myIndex_mex)
verifyMEX = logical
1
isequal
は、すべての入力が等しいことを意味する logical 1 (true
) を返します。この比較により、同じインデックスを関数 pdist2
、関数 findNearestCentroid
、および MEX 関数が返すことを確認します。
GPU Coder™ を使用して、最適化された CUDA® コードを生成することもできます。
cfg = coder.gpuConfig('mex'); codegen -config cfg findNearestCentroid -args {C,Xtest}
コード生成の詳細については、一般的なコード生成のワークフローを参照してください。GPU Coder の詳細については、GPU Coder 入門 (GPU Coder)とサポートされる関数 (GPU Coder)を参照してください。
入力引数
X,Y
— 入力データ
数値行列
入力データ。数値行列を指定します。X
は mx 行 n 列の行列、Y
は my 行 n 列の行列です。行は各観測値に、列は各変数に対応します。
データ型: single
| double
Distance
— 距離計量
文字ベクトル | string スカラー | 関数ハンドル
距離計量。次の表に記載されているように文字ベクトル、string スカラーまたは関数ハンドルを指定します。
値 | 説明 |
---|---|
'euclidean' | ユークリッド距離 (既定の設定)。 |
'squaredeuclidean' | 2 乗ユークリッド距離(効率向上のみを目的に提供されているオプション。三角不等式は満たさない)。 |
'seuclidean' | 標準化されたユークリッド距離。観測値間の各座標差は、標準偏差 |
'mahalanobis' |
|
'cityblock' | 市街地距離。 |
'minkowski' | ミンコフスキー距離。既定の指数は 2 です。異なる指数 |
'chebychev' | チェビシェフ距離 (最大座標差)。 |
'cosine' | 1 から、ベクトルとして扱われる点の間の夾角の余弦を引いた値。 |
'correlation' | 1 から、値の系列として扱われる点の間の標本相関を引いた値。 |
'hamming' | 異なる座標の比率を示すハミング距離。 |
'jaccard' | 1 から、ジャカード係数 (異なる非ゼロ座標の比率) を引いた値。 |
'spearman' | 1 から、観測値間の標本スピアマンの順位相関 (値の系列として扱われる) を引いた値。 |
@ | カスタム距離関数のハンドル。距離関数の形式は次のようになります。 function D2 = distfun(ZI,ZJ) % calculation of distance ...
データがスパースでない場合、通常は関数ハンドルではなく組み込みの距離を使用する方が高速に距離を計算できます。 |
定義については距離計量を参照してください。
'seuclidean'
、'minkowski'
または 'mahalanobis'
を使用する場合、これらの尺度を制御する追加入力引数 DistParameter
を指定できます。DistParameter
を既定値にすると、これらの尺度を他の尺度と同じ方法で使用できます。
例: 'minkowski'
DistParameter
— 距離計量のパラメーター値
正のスカラー | 数値ベクトル | 数値行列
距離計量のパラメーター値。正のスカラー、数値ベクトルまたは数値行列を指定します。この引数は、Distance
として 'seuclidean'
、'minkowski'
または 'mahalanobis'
を指定した場合のみ有効です。
Distance
が'seuclidean'
の場合、DistParameter
は各次元のスケーリング係数のベクトルで、正のベクトルを指定します。既定値はstd(X,'omitnan')
です。Distance
が'minkowski'
の場合、DistParameter
はミンコフスキー距離の指数で、正のスカラーを指定します。既定値は 2 です。Distance
が'mahalanobis'
の場合、DistParameter
は共分散行列で、数値行列を指定します。既定値はcov(X,'omitrows')
です。DistParameter
は、対称な正定値行列でなければなりません。
例: 'minkowski',3
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: 'Smallest',K
または 'Largest',K
。'Smallest'
と 'Largest'
を同時に使用することはできません。
Smallest
— 求める最小距離の個数
正の整数
求める最小距離の個数。'Smallest'
と正の整数から構成されるコンマ区切りのペアとして指定します。'Smallest'
を指定した場合、pdist2
は D
の各列の距離を昇順で並べ替えます。
例: 'Smallest',3
データ型: single
| double
Largest
— 求める最大距離の個数
正の整数
求める最大距離の個数。'Largest'
と正の整数から構成されるコンマ区切りのペアとして指定します。'Largest'
を指定した場合、pdist2
は D
の各列の距離を降順で並べ替えます。
例: 'Largest',3
データ型: single
| double
出力引数
D
— ペアワイズ距離
数値行列
ペアワイズ距離。数値行列として返されます。
'Smallest'
も 'Largest'
も指定しなかった場合、D
は mx 行 my 列の行列になります。mx と my はそれぞれ X
および Y
内の観測値の個数です。D(i,j)
は、X
内の観測値 i
と Y
内の観測値 j
の間の距離です。X
内の観測値 i または Y
内の観測値 j に NaN
が含まれている場合、組み込み距離関数では D(i,j)
が NaN
になります。
'Smallest'
または 'Largest'
として K
を指定した場合、D
は K
行 my 列の行列になります。D
には、Y
内の各観測値について X
内の観測値に対する K
個の最小のペアワイズ距離または K
個の最大のペアワイズ距離が格納されます。Y
の各観測値に対し、pdist2
は X
内の観測値すべてに対する距離値を計算して比較することで、最小または最大の距離 K
を求めます。K
が mx より大きい場合、pdist2
は mx 行 my 列の行列を返します。
I
— 並べ替えのインデックス
正の整数の行列
並べ換えのインデックス。正の整数の行列として返されます。I
は D
と同じサイズです。I
には、D
内の距離に対応する X
内の観測値のインデックスが格納されます。
詳細
距離計量
距離計量は、2 つの観測値の間の距離を定義する関数です。pdist2
は、以下の各種距離計量、ユークリッド距離、標準化されたユークリッド距離、マハラノビス距離、市街地距離、ミンコフスキー距離、チェビシェフ距離、コサイン距離、相関距離、ハミング距離、Jaccard 距離およびスピアマン距離をサポートします。
mx 行 n 列のデータ行列 X (mx 個の 1 行 n 列の行ベクトル x1、x2、...、xmx として扱われる) と、my 行 n 列のデータ行列 Y (my 個の 1 行 n 列の行ベクトル y1、y2、...、ymy として扱われる) が与えられた場合、ベクトル xs と yt の間のさまざまな距離は次のように定義されます。
ユークリッド距離
ユークリッド距離はミンコフスキー距離の特殊なケース、p = 2 の場合です。
標準化されたユークリッド距離
ここで、V は j 番目の対角要素が (S(j))2 である n 行 n 列の対角行列です。S は各次元のスケーリング係数のベクトルです。
マハラノビス距離
ここで、C は共分散行列です。
市街地距離
市街地距離はミンコフスキー距離の特殊なケース、p = 1 の場合です。
ミンコフスキー距離
p = 1 という特殊なケースでは、ミンコフスキー距離は市街地距離を与えます。p = 2 という特殊なケースでは、ミンコフスキー距離はユークリッド距離を与えます。p = ∞ という特殊なケースでは、ミンコフスキー距離はチェビシェフ距離を与えます。
チェビシェフ距離
チェビシェフ距離はミンコフスキー距離の特殊なケース、p = ∞ の場合です。
コサイン距離
相関距離
ここで
および
ハミング距離
Jaccard 距離
スピアマン距離
ここで
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
距離の入力引数 (
Distance
) の値は、コンパイル時の定数でなければなりません。たとえば、ミンコフスキー距離を使用するには、coder.Constant('Minkowski')
をcodegen
の-args
の値に含めます。距離の入力引数 (
Distance
) の値をカスタム距離関数にすることはできません。名前と値の引数に含まれる名前はコンパイル時の定数でなければなりません。たとえば、生成されたコードで名前と値のペアの引数
'Smallest'
を使用するには、{coder.Constant('Smallest'),0}
をcodegen
(MATLAB Coder) の-args
の値に含めます。数値の精度のため、生成されたコードにおける同順位の距離の並べ替え順序は MATLAB® における順序と異なる可能性があります。
pdist2
に対して生成されるコードでは、parfor
(MATLAB Coder) を使用して、サポートされる共有メモリ マルチコア プラットフォームで並列実行されるループが作成されます。コンパイラが Open Multiprocessing (OpenMP) アプリケーション インターフェイスをサポートしない場合、または OpenMP ライブラリを無効にした場合、MATLAB Coder™ はparfor
ループをfor
ループとして扱います。サポートされるコンパイラについては、サポートされるコンパイラを参照してください。OpenMP ライブラリを無効にするには、構成オブジェクトのEnableOpenMP
プロパティをfalse
に設定します。詳細については、coder.CodeConfig
(MATLAB Coder) を参照してください。R2020a 以降は、
pdist2
は、生成されたスタンドアロン C/C++ コードにおいて、倍精度のインデックスではなく、整数型 (int32
) のインデックスを返します。そのため、関数は、単精度の入力を使用する場合、厳密な単精度のサポートを可能にします。MEX コード生成では、関数は依然として MATLAB の動作に一致する倍精度のインデックスを返します。
コード生成の詳細については、コード生成の紹介および一般的なコード生成のワークフローを参照してください。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意事項および制限事項:
最適化された CUDA コードについてサポートされる距離入力引数値 (
Distance
) は、'euclidean'
、'squaredeuclidean'
、'seuclidean'
、'cityblock'
、'minkowski'
、'chebychev'
、'cosine'
、'correlation'
、'hamming'
および'jaccard'
です。Distance
をカスタム距離関数にすることはできません。Distance
はコンパイル時の定数でなければなりません。名前と値のペアの引数に含まれる名前はコンパイル時の定数でなければなりません。
数値の精度のため、生成されたコードにおける同順位の距離の並べ替え順序は MATLAB における順序と異なる可能性があります。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
距離の入力引数 (
Distance
) の値をカスタム距離関数にすることはできません。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2010a で導入
参考
pdist
| createns
| knnsearch
| ExhaustiveSearcher
| KDTreeSearcher
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)