Main Content

pdist

観測値ペア間のペアワイズ距離

説明

D = pdist(X) は、X 内の観測値ペア間のユークリッド距離を返します。

D = pdist(X,Distance) は、Distance で指定された方式を使用して距離を返します。

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

D = pdist(X,Distance,CacheSize=cache) または D = pdist(X,Distance,DistParameter,CacheSize=cache) は、サイズが cache メガバイトのキャッシュを使用してユークリッド距離の計算を高速化します。この引数は、Distance'fasteuclidean''fastsquaredeuclidean'、または 'fastseuclidean' の場合のみ適用されます。

すべて折りたたむ

観測値ペア間のユークリッド距離を計算し、squareform を使用して距離ベクトルを行列に変換します。

3 つの観測値と 2 つの変数を使用して行列を作成します。

rng('default') % For reproducibility
X = rand(3,2);

ユークリッド距離を計算します。

D = pdist(X)
D = 1×3

    0.2954    1.0670    0.9448

ペアワイズ距離は (2,1)、(3,1)、(3,2) という順序で編成されます。観測値 i および j の間の距離は、squareform を使用すると簡単に求めることができます。

Z = squareform(D)
Z = 3×3

         0    0.2954    1.0670
    0.2954         0    0.9448
    1.0670    0.9448         0

squareform は、Z(i,j) が観測値 i および j の間のペアワイズ距離に対応する対称行列を返します。たとえば、観測値 2 および 3 の間の距離は次のように求めることができます。

Z(2,3)
ans = 
0.9448

Z を関数 squareform に渡して、関数 pdist の出力を再現します。

y = squareform(Z)
y = 1×3

    0.2954    1.0670    0.9448

squareform の出力 ypdist の出力 D は同じです。

3 つの観測値と 2 つの変数を使用して行列を作成します。

rng('default') % For reproducibility
X = rand(3,2);

既定の指数 2 を使用してミンコフスキー距離を計算します。

D1 = pdist(X,'minkowski')
D1 = 1×3

    0.2954    1.0670    0.9448

指数を 1 にしてミンコフスキー距離を計算します。これは市街地距離に等しくなります。

D2 = pdist(X,'minkowski',1)
D2 = 1×3

    0.3721    1.5036    1.3136

D3 = pdist(X,'cityblock')
D3 = 1×3

    0.3721    1.5036    1.3136

NaN 値がある座標を無視するカスタム距離関数を定義し、この関数を使用してペアワイズ距離を計算します。

3 つの観測値と 2 つの変数を使用して行列を作成します。

rng('default') % For reproducibility
X = rand(3,2);

1 番目の観測値の 1 番目の要素が欠損していると仮定します。

X(1,1) = NaN;

ユークリッド距離を計算します。

D1 = pdist(X)
D1 = 1×3

       NaN       NaN    0.9448

観測値 i または jNaN 値が含まれている場合、関数 pdistij の間のペアワイズ距離として NaN を返します。したがって、(2,1) と (3,1) のペアワイズ距離である D1(1) および D1(2) は NaN 値になります。

NaN 値がある座標を無視してユークリッド距離を返すカスタム距離関数 naneucdist を定義します。

function D2 = naneucdist(XI,XJ)  
%NANEUCDIST Euclidean distance ignoring coordinates with NaNs
n = size(XI,2);
sqdx = (XI-XJ).^2;
nstar = sum(~isnan(sqdx),2); % Number of pairs that do not contain NaNs
nstar(nstar == 0) = NaN; % To return NaN if all pairs include NaNs
D2squared = sum(sqdx,2,'omitnan').*n./nstar; % Correction for missing coordinates
D2 = sqrt(D2squared);

pdist の入力引数として関数ハンドルを渡すことにより、naneucdist で距離を計算します。

D2 = pdist(X,@naneucdist)
D2 = 1×3

    0.3974    1.1538    0.9448

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

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

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

D = pdist(X,"fasteuclidean",CacheSize=10); % Warm up function
tic
D2 = pdist(X,"fasteuclidean",CacheSize=10);
accelerated = toc
accelerated = 
0.8650

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

standard/accelerated
ans = 
6.9955

この例では、高速化したバージョンの方が計算が約 3 倍速くなっています。

入力引数

すべて折りたたむ

入力データ。mn 列の数値行列を指定します。行は各観測値に、列は各変数に対応します。

データ型: 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

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

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

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

例: "maximal"

データ型: double | char | string

出力引数

すべて折りたたむ

ペアワイズ距離。観測値のペアに対応する、長さ m(m–1)/2 の数値行ベクトルとして返されます。mX 内の観測値の個数です。

距離は、(2,1)、(3,1)、...、(m,1)、(3,2)、...、(m,2)、...、(m,m-1) という順序で編成されます。つまり、mm 列の距離行列の左下三角の列順になります。観測値 i および j の間のペアワイズ距離は、ij について D((i-1)*(m-i/2)+j-i) にあります。

関数 squareform を使用すると、D を対称行列に変換できます。Z = squareform(D) は、Z(i,j) が観測値 i および j の間のペアワイズ距離に対応する、mm 列の行列を返します。

観測値 i または jNaN が含まれている場合、組み込み距離関数では D 内の対応する値が NaN になります。

通常、D はクラスタリングまたは多次元尺度構成法で非類似度行列として使用されます。詳細については、階層クラスタリングと、関数 cmdscalecophenetlinkagemdscale および optimalleaforder のリファレンス ページを参照してください。これらの関数は入力引数として D を受け入れます。

詳細

すべて折りたたむ

距離計量

距離計量は、2 つの観測値の間の距離を定義する関数です。pdist は、以下の各種距離計量、ユークリッド距離、標準化されたユークリッド距離、マハラノビス距離、市街地距離、ミンコフスキー距離、チェビシェフ距離、コサイン距離、相関距離、ハミング距離、Jaccard 距離およびスピアマン距離をサポートします。

m 個の (1 行 n 列の) 行ベクトル x1x2、...、xm として扱われる mn 列のデータ行列 X に対して、ベクトル xsxt の間で各種の距離は次のように定義されます。

  • ユークリッド距離

    dst2=(xsxt)(xsxt).

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

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

    dst2=(xsxt)V1(xsxt),

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

  • マハラノビス距離

    dst2=(xsxt)C1(xsxt),

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

  • 市街地距離

    dst=j=1n|xsjxtj|.

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

  • ミンコフスキー距離

    dst=j=1n|xsjxtj|pp.

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

  • チェビシェフ距離

    dst=maxj{|xsjxtj|}.

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

  • コサイン距離

    dst=1xsxt(xsxs)(xtxt).

  • 相関距離

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

    ここで

    x¯s=1njxsj および x¯t=1njxtj です。

  • ハミング距離

    dst=(#(xsjxtj)/n).

  • Jaccard 距離

    dst=#[(xsjxtj)((xsj0)(xtj0))]#[(xsj0)(xtj0)].

  • スピアマン距離

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

    ここで

    • rsj は、tiedrank により計算される、x1jx2j、... xmj から取得された xsj の順位です。

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

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

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

アルゴリズム

すべて折りたたむ

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

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

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

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

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

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

参照

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

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する