Main Content

pdist2

観測値の 2 つの集合間のペアワイズ距離

説明

D = pdist2(X,Y,Distance) は、Distance によって指定される尺度を使用して、X および Y に含まれている観測値の各ペアの間の距離を返します。

D = pdist2(X,Y,Distance,DistParameter) は、Distance および DistParameter で指定された尺度を使用して距離を返します。DistParameter を指定できるのは、Distance'seuclidean''minkowski' または 'mahalanobis' である場合だけです。

D = pdist2(___,Name,Value) は、上記の任意の引数について、名前と値のパラメーターを使用して計算を変更します。たとえば、以下のようにします。

  • 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(___) は行列 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 内の観測値 iY 内の観測値 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

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 内の観測値のインデックスが格納されます。

2 つの大規模な点の行列を作成し、既定の "euclidean" 距離計量を使用した pdist2 の所要時間を測定します。

rng default % For reproducibility
N = 10000;
X = randn(N,1000);
Y = randn(N,1000);
D = pdist2(X,Y); % Warm up function for more reliable timing information
tic
D = pdist2(X,Y);
standard = toc
standard = 12.0550

次に、"fasteuclidean" 距離計量を使用した pdist2 の所要時間を測定します。キャッシュ サイズは 100 に指定します。

D = pdist2(X,Y,"fasteuclidean",CacheSize=100); % Warm up function
tic
D2 = pdist2(X,Y,"fasteuclidean",CacheSize=100);
accelerated = toc
accelerated = 1.3199

計算の高速化によって標準よりも何倍速くなったかを評価します。

standard/accelerated
ans = 9.1333

この例では、高速化したバージョンの方が 2 倍を超える速さになっています。

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 内の観測値 jNaN 値が含まれている場合、関数 pdist2ij の間のペアワイズ距離として 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

kmeansは、k-means クラスタリングを実行して、データを k 個のクラスターに分割します。新しいデータセットをクラスター化するときに、kmeans を使用して、既存のデータと新しいデータが含まれる新しいクラスターを作成できます。関数 kmeans は C/C++ コード生成をサポートするので、学習データを受け入れてクラスター化の結果を返すコードを生成してから、コードをデバイスに展開できます。このワークフローでは学習データを渡さなければなりませんが、サイズが非常に大きい可能性があります。デバイスのメモリを節約するため、kmeanspdist2をそれぞれ使用して、学習と予測を分離することができます。

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')

Figure contains an axes object. The axes object contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent 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')

Figure contains an axes object. The axes object contains 7 objects of type line. One or more of the lines displays its values using only markers These objects represent 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 は mx 行 n 列の行列、Y は my 行 n 列の行列です。行は各観測値に、列は各変数に対応します。

データ型: single | double

距離計量。次の表に記載されているように文字ベクトル、string スカラーまたは関数ハンドルを指定します。

説明
'euclidean'

ユークリッド距離 (既定)

'squaredeuclidean'

2 乗ユークリッド距離(効率向上のみを目的に提供されているオプション。三角不等式は満たさない)。

'seuclidean'

標準化されたユークリッド距離。観測値間の各座標差は、標準偏差 S = std(X,'omitnan') の対応する要素で除算することによりスケーリングされます。S について別の値を指定するには、DistParameter を使用します。

'fasteuclidean'予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算されるユークリッド距離。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。詳細については、アルゴリズムを参照してください。
'fastsquaredeuclidean'予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算される 2 乗ユークリッド距離。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。詳細については、アルゴリズムを参照してください。
'fastseuclidean'予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算される標準化されたユークリッド距離。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。詳細については、アルゴリズムを参照してください。
'mahalanobis'

X の標本共分散を使用して C = cov(X,'omitrows') として計算されるマハラノビス距離。C について別の値を指定するには、DistParameter を使用します。ここで、行列 C は対称な正定値です。

'cityblock'

市街地距離

'minkowski'

ミンコフスキー距離。既定の指数は 2 です。異なる指数 P を指定するには、DistParameter を使用します。P は指数を表す正のスカラー値です。

'chebychev'

チェビシェフ距離 (最大座標差)

'cosine'

1 から、ベクトルとして扱われる点の間の夾角の余弦を引いた値

'correlation'

1 から、値の系列として扱われる点の間の標本相関を引いた値

'hamming'

ハミング距離 (異なる座標の比率)

'jaccard'

1 からジャカード係数 (異なる非ゼロ座標の比率) を減算

'spearman'

1 から観測値間の標本スピアマン順位相関係数を減算 (値の系列として処理)

@distfun

カスタム距離関数のハンドル。距離関数の形式は次のようになります。

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
ここで、

  • ZI は、単一の観測値が含まれている 1n 列のベクトルです。

  • ZJ は、複数の観測値が含まれている m2n 列の行列です。distfun は、任意の個数の観測値が含まれている行列 ZJ を受け入れなければなりません。

  • D2m21 列の距離のベクトルであり、D2(k) は観測値 ZIZJ(k,:) の間の距離です。

データがスパースでない場合、通常は関数ハンドルではなく組み込みの距離計量を使用する方が高速に距離を計算できます。

定義については距離計量を参照してください。

'seuclidean''minkowski' または 'mahalanobis' を使用する場合、これらの尺度を制御する追加入力引数 DistParameter を指定できます。DistParameter を既定値にすると、これらの尺度を他の尺度と同じ方法で使用できます。

例: 'minkowski'

データ型: char | string | function_handle

距離計量のパラメーター値。正のスカラー、数値ベクトルまたは数値行列を指定します。この引数は、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' を同時に使用することはできません。

メガバイト単位のグラム行列のサイズ。正のスカラーまたは 'maximal' として指定します。関数 pdist2CacheSize を使用できるのは、引数 Distancefast で始まる場合のみです。

'maximal' の場合、pdist2 は、MXMY 列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、MX は入力データ X の行数、MY は入力データ Y の行数です。キャッシュ サイズは、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも MX 行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、pdist2 でのユークリッド距離の計算に通常のアルゴリズムが使用されます。

距離の引数が fast で始まる場合に、CacheSize の値が大きすぎるか 'maximal' であると、利用可能なメモリを超えるグラム行列の割り当てが pdist2 で試行されることがあります。この場合、MATLAB® はエラーを生成します。

例: CacheSize='maximal'

データ型: double | char | string

求める最小距離の個数。'Smallest' と正の整数から構成されるコンマ区切りのペアとして指定します。'Smallest' を指定した場合、pdist2D の各列の距離を昇順で並べ替えます。引数 SmallestLargest は、いずれか 1 つだけを使用できます。

例: 'Smallest',3

データ型: single | double

求める最大距離の個数。'Largest' と正の整数から構成されるコンマ区切りのペアとして指定します。'Largest' を指定した場合、pdist2D の各列の距離を降順で並べ替えます。引数 SmallestLargest は、いずれか 1 つだけを使用できます。

例: 'Largest',3

データ型: single | double

出力引数

すべて折りたたむ

ペアワイズ距離。数値行列として返されます。

'Smallest''Largest' も指定しなかった場合、D は mx 行 my 列の行列になります。mx と my はそれぞれ X および Y 内の観測値の個数です。D(i,j) は、X 内の観測値 iY 内の観測値 j の間の距離です。X 内の観測値 i または Y 内の観測値 j に NaN が含まれている場合、組み込み距離関数では D(i,j)NaN になります。

'Smallest' または 'Largest' として K を指定した場合、DK 行 my 列の行列になります。D には、Y 内の各観測値について X 内の観測値に対する K 個の最小のペアワイズ距離または K 個の最大のペアワイズ距離が格納されます。Y の各観測値に対し、pdist2X 内の観測値すべてに対する距離値を計算して比較することで、最小または最大の距離 K を求めます。K が mx より大きい場合、pdist2 は mx 行 my 列の行列を返します。

並べ換えのインデックス。正の整数の行列として返されます。ID と同じサイズです。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 の間のさまざまな距離は次のように定義されます。

  • ユークリッド距離

    dst2=(xsyt)(xsyt).

    ユークリッド距離はミンコフスキー距離の特殊なケース、p = 2 の場合です。

    ユークリッド距離を指定するには、Distance パラメーターを 'euclidean' に設定します。

  • 標準化されたユークリッド距離

    dst2=(xsyt)V1(xsyt),

    ここで、V は j 番目の対角要素が (S(j))2 である n 行 n 列の対角行列です。S は各次元のスケーリング係数のベクトルです。

    標準化されたユークリッド距離を指定するには、Distance パラメーターを 'seuclidean' に設定します。

  • 高速ユークリッド距離はユークリッド距離と同じで、予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算されます。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。スパース データはサポートされません。高速ユークリッド距離アルゴリズムを参照してください。

    高速ユークリッド距離を指定するには、Distance パラメーターを 'fasteuclidean' に設定します。

  • 標準化された高速ユークリッド距離は標準化されたユークリッド距離と同じで、予測子の数が 10 個以上の場合に時間の短縮になる代替アルゴリズムを使用して計算されます。このアルゴリズムは高速ですが、場合によっては精度が低下することがあります。スパース データはサポートされません。高速ユークリッド距離アルゴリズムを参照してください。

    標準化された高速ユークリッド距離を指定するには、Distance パラメーターを 'fastseuclidean' に設定します。

  • マハラノビス距離

    dst2=(xsyt)C1(xsyt),

    ここで、C は共分散行列です。

    マハラノビス距離を指定するには、Distance パラメーターを 'mahalanobis' に設定します。

  • 市街地距離

    dst=j=1n|xsjytj|.

    市街地距離はミンコフスキー距離の特殊なケース、p = 1 の場合です。

    市街地距離を指定するには、Distance パラメーターを 'cityblock' に設定します。

  • ミンコフスキー距離

    dst=j=1n|xsjytj|pp.

    p = 1 という特殊なケースでは、ミンコフスキー距離は市街地距離を与えます。p = 2 という特殊なケースでは、ミンコフスキー距離はユークリッド距離を与えます。p = ∞ という特殊なケースでは、ミンコフスキー距離はチェビシェフ距離を与えます。

    ミンコフスキー距離を指定するには、Distance パラメーターを 'minkowski' に設定します。

  • チェビシェフ距離

    dst=maxj{|xsjytj|}.

    チェビシェフ距離はミンコフスキー距離の特殊なケース、p = ∞ の場合です。

    チェビシェフ距離を指定するには、Distance パラメーターを 'chebychev' に設定します。

  • コサイン距離

    dst=(1xsyt(xsxs)(ytyt)).

    コサイン距離を指定するには、Distance パラメーターを 'cosine' に設定します。

  • 相関距離

    dst=1(xsx¯s)(yty¯t)(xsx¯s)(xsx¯s)(yty¯t)(yty¯t),

    ここで

    x¯s=1njxsj

    および

    y¯t=1njytj.

    相関距離を指定するには、Distance パラメーターを 'correlation' に設定します。

  • ハミング距離は、一致しない座標の比率です。

    dst=(#(xsjytj)/n).

    ハミング距離を指定するには、Distance パラメーターを 'hamming' に設定します。

  • Jaccard 距離は、1 からジャカード係数 (異なる非ゼロ座標の比率) を引きます。

    dst=#[(xsjytj)((xsj0)(ytj0))]#[(xsj0)(ytj0)].

    Jaccard 距離を指定するには、Distance パラメーターを 'jaccard' に設定します。

  • スピアマン距離は、1 から一連の値として扱われる観測値間の標本スピアマン順位相関係数を引きます。

    dst=1(rsr¯s)(rtr¯t)(rsr¯s)(rsr¯s)(rtr¯t)(rtr¯t),

    ここで

    • rsj は、tiedrank により計算される、x1j、x2j、...xmx,j から取得された xsj の順位です。

    • rtj は、tiedrank により計算される、y1j、y2j、...ymy,j から取得された ytj の順位です。

    • rs および rt は、xs および yt の座標単位の順位ベクトルです。つまり、rs = (rs1, rs2, ... rsn) および rt = (rt1, rt2, ... rtn) です。

    • r¯s=1njrsj=(n+1)2.

    • r¯t=1njrtj=(n+1)2.

    スピアマン距離を指定するには、Distance パラメーターを 'spearman' に設定します。

アルゴリズム

すべて折りたたむ

高速ユークリッド距離アルゴリズム

Distance 引数の fast から始まる値 ('fasteuclidean''fastseuclidean' など) で使用されるアルゴリズムでは、計算時間の短縮のために追加のメモリを使用してユークリッド距離が計算されます。このアルゴリズムは、Albanie の[1]などで "ユークリッド距離行列トリック" として提唱されているものです。内部テストでは、このアルゴリズムによって予測子の数が 10 個以上の場合に時間の短縮になることが確認されています。'fast' から始まるアルゴリズムでは、スパース データはサポートされません。

このアルゴリズムでは、xi と xj のすべての点間の距離の行列 D を求めるために (xi のそれぞれに n 個の変数を格納)、次の方程式の最後の行を使用して距離を計算します。

Di,j2=xixj2=(xixj)T(xixj)=xi22xiTxj+xj2.

方程式の最後の行にある行列 xiTxj"グラム行列" と呼ばれます。正方化と加算によって平方距離を計算する代わりに、グラム行列を計算して使用すると、一連の平方距離の計算は高速になりますが、数値的安定性は少し低くなります。詳細については、Albanie の[1]を参照してください。

グラム行列を格納するためにソフトウェアで既定で使用されるキャッシュのサイズは 1e3 メガバイトです。キャッシュ サイズは名前と値の引数 CacheSize を使用して設定できます。CacheSize の値が大きすぎるか "maximal" である場合、利用可能なメモリを超えるグラム行列の割り当てが pdist2 で試行されることがあります。この場合、MATLAB はエラーを生成します。

参照

[1] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf.

拡張機能

バージョン履歴

R2010a で導入

すべて展開する