Main Content

pdist

관측값 쌍 간의 쌍별(Pairwise) 거리

설명

예제

D = pdist(X)X에 포함된 관측값 쌍 간의 유클리드 거리를 반환합니다.

예제

D = pdist(X,Distance)Distance로 지정된 방법을 사용하여 거리를 반환합니다.

예제

D = pdist(X,Distance,DistParameter)DistanceDistParameter로 지정된 방법을 사용하여 거리를 반환합니다. Distance'seuclidean', 'minkowski' 또는 'mahalanobis'인 경우에만 DistParameter를 지정할 수 있습니다.

예제

D = pdist(X,Distance,CacheSize=cache) 또는 D = pdist(X,Distance,DistParameter,CacheSize=cache)cache 메가바이트 크기의 캐시를 사용하여 유클리드 거리의 계산을 가속화합니다. 이 인수는 Distance'fasteuclidean', 'fastsquaredeuclidean' 또는 'fastseuclidean'인 경우에만 적용됩니다.

예제

모두 축소

관측값 쌍 간의 유클리드 거리를 계산하고 squareform을 사용하여 거리 벡터를 행렬로 변환합니다.

세 개의 관측값과 두 개의 변수를 갖는 행렬을 생성합니다.

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

유클리드 거리를 계산합니다.

D = pdist(X)
D = 1×3

    0.2954    1.0670    0.9448

쌍별(Pairwise) 거리가 인덱스 (2,1), (3,1), (3,2)에 배열됩니다. squareform을 사용하여 관측값 i와 관측값 j 간의 거리를 쉽게 확인할 수 있습니다.

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)는 관측값 ij 간의 쌍별 거리를 나타냅니다. 예를 들어, 관측값 2와 관측값 3 간의 거리를 구할 수 있습니다.

Z(2,3)
ans = 0.9448

Zsquareform 함수에 전달하여 pdist 함수의 출력값을 재현합니다.

y = squareform(Z)
y = 1×3

    0.2954    1.0670    0.9448

squareform의 출력값 ypdist의 출력값 D는 같습니다.

세 개의 관측값과 두 개의 변수를 갖는 행렬을 생성합니다.

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 값을 갖는 좌표를 무시하는 사용자 지정 거리 함수를 정의하고 이 사용자 지정 거리 함수를 사용하여 쌍별 거리를 계산합니다.

세 개의 관측값과 두 개의 변수를 갖는 행렬을 생성합니다.

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

첫 번째 관측값의 첫 번째 요소가 누락되었다고 가정합니다.

X(1,1) = NaN;

유클리드 거리를 계산합니다.

D1 = pdist(X)
D1 = 1×3

       NaN       NaN    0.9448

관측값 i 또는 관측값 jNaN 값을 포함하는 경우 함수 pdistij 간의 쌍별 거리로 NaN을 반환합니다. 따라서, D1(1) 및 D1(2), 즉 쌍별 거리 (2,1) 및 (3,1)은 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);

naneucdist를 사용하고 pdist의 입력 인수로 함수 핸들을 전달하여 거리를 계산합니다.

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 = 10.4788

다음으로, "fasteuclidean" 거리 측정법을 사용한 pdist에 쓰인 시간을 측정합니다. 캐시 크기를 10으로 지정합니다.

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

가속화된 계산이 표준과 비교하여 몇 배 더 빠른지 평가합니다.

standard/accelerated
ans = 6.1471

이 예제의 경우 가속화된 버전은 약 3배 더 빠르게 계산합니다.

입력 인수

모두 축소

입력 데이터로, 크기가 m×n인 숫자형 행렬로 지정됩니다. 행은 개별 관측값에 대응되고, 열은 개별 변수에 대응됩니다.

데이터형: single | double

거리 측정법으로, 다음 표에 설명된 대로 문자형 벡터, string형 스칼라 또는 함수 핸들로 지정됩니다.

설명
'euclidean'

유클리드 거리(디폴트 값)

'squaredeuclidean'

제곱 유클리드 거리입니다. (이 옵션은 효율성을 위해서만 제공됩니다. 삼각 부등식을 충족하지 않습니다.)

'seuclidean'

표준화된 유클리드 거리입니다. 관측값 간의 각 좌표 차이는 표준편차 S = std(X,'omitnan')의 대응 요소로 나누어져 스케일링됩니다. S에 다른 값을 지정하려면 DistParameter를 사용하십시오.

'fasteuclidean'예측 변수 개수가 10개 이상인 경우 시간을 아끼는 대체 알고리즘을 사용하여 계산된 유클리드 거리입니다. 속도가 더 빠른 이 알고리즘은 정확도가 떨어질 수 있습니다. 'fast'로 시작하는 알고리즘은 희소 형식 데이터를 지원하지 않습니다. 자세한 내용은 알고리즘 항목을 참조하십시오.
'fastsquaredeuclidean'예측 변수 개수가 10개 이상인 경우 시간을 아끼는 대체 알고리즘을 사용하여 계산된 제곱 유클리드 거리입니다. 속도가 더 빠른 이 알고리즘은 정확도가 떨어질 수 있습니다. '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'

0이 아닌 두 좌표의 값이 서로 다른 비율인 자카드 계수를 1에서 뺀 값

'spearman'

1에서 관측값 간 표본 스피어만의 순위 상관 계수를 뺀 값(일련의 값으로 처리됨)

@distfun

사용자 지정 거리 함수 핸들입니다. 거리 함수의 형식은 다음과 같습니다.

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
여기서

  • ZI는 단일 관측값을 포함하는 1×n 벡터입니다.

  • ZJ는 여러 관측값을 포함하는 m2×n 행렬입니다. distfun은 임의 개수의 관측값을 갖는 행렬 ZJ를 받아야 합니다.

  • D2는 거리로 구성된 m2×1 벡터이고, 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"로 지정됩니다. pdist 함수는 Distance 인수가 'fasteuclidean', 'fastsquaredeuclidean' 또는 'fastseuclidean'인 경우에만 CacheSize=cache를 사용할 수 있습니다.

cache"maximal"인 경우 pdist는 크기가 M×M인 전체 중간 행렬에 대해 충분한 메모리를 할당하려고 시도합니다. 여기서 M은 입력 데이터 X의 행 개수입니다. 캐시 크기는 중간 행렬 전체를 다 담을 만큼 크지 않아도 되지만 적어도 M×1 벡터를 유지할 수 있을 만큼 커야 합니다. 그렇지 않은 경우 pdist는 표준 알고리즘을 사용하여 유클리드 거리를 계산합니다.

거리 인수가 'fasteuclidean', 'fastsquaredeuclidean' 또는 'fastseuclidean'이고 cache 값이 너무 크거나 "maximal"인 경우, pdist 함수는 사용 가능한 메모리를 초과하는 그람 행렬을 할당하려고 시도할 수 있습니다. 이 경우, MATLAB®에서 오류를 발생시킵니다.

예: "maximal"

데이터형: double | char | string

출력 인수

모두 축소

쌍별(Pairwise) 거리로, 관측값 쌍에 대응되는 길이가 m(m–1)/2인 숫자형 행 벡터로 반환됩니다. 여기서 m은 X에 포함된 관측값의 개수입니다.

거리는 (2,1), (3,1), ..., (m,1), (3,2), ..., (m,2), ..., (m,m–1), 즉 m×m 거리 행렬의 왼쪽 아래 삼각 부분이 열 순서대로 배열됩니다. 관측값 i와 관측값 j 간의 쌍별 거리는 i≤j에 대해 D((i-1)*(m-i/2)+j-i)로 정의됩니다.

squareform 함수를 사용하여 D를 대칭 행렬로 변환할 수 있습니다. Z = squareform(D)는 m×m 행렬을 반환합니다. 여기서 Z(i,j)는 관측값 i와 관측값 j 간의 쌍별 거리를 나타냅니다.

내장 거리 함수의 경우, 관측값 i나 관측값 j가 NaN을 포함하면 D의 대응값은 NaN이 됩니다.

D는 군집화 또는 다차원 스케일링에서 비유사성 행렬로 주로 사용됩니다. 자세한 내용은 계층적 군집화 항목과 cmdscale, cophenet, linkage, mdscale, optimalleaforder의 함수 도움말 페이지를 참조하십시오. 이들 함수는 D를 입력 인수로 받습니다.

세부 정보

모두 축소

거리 측정법

거리 측정법은 두 관측값 간의 거리를 정의하는 함수입니다. pdist는 다음과 같은 다양한 거리 측정법을 지원합니다. 유클리드 거리, 표준화된 유클리드 거리, 마할라노비스 거리, 도시 블록 거리, 민코프스키 거리, 체비쇼프 거리, 코사인 거리, 상관관계 거리, 해밍 거리, 자카드 거리, 스피어만 거리.

m×n 데이터 행렬 X가 주어진 경우, 이는 m(1×n)개 행 벡터 x1, x2, ..., xm으로 처리되며, 벡터 xs와 벡터 xt 간의 다양한 거리는 다음과 같이 정의됩니다.

  • 유클리드 거리

    dst2=(xsxt)(xsxt).

    유클리드 거리는 p = 2인 민코프스키 거리의 특수한 사례입니다.

  • 표준화된 유클리드 거리

    dst2=(xsxt)V1(xsxt),

    여기서 V는 j번째 대각선 요소가 (S(j))2인 n×n 대각 행렬입니다(여기서 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).

  • 자카드 거리

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

  • 스피어만 거리

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

    여기서

    • rsj는 x1j, x2j, ...xmj에 대해 얻은 xsj의 순위로, tiedrank에 의해 계산됩니다.

    • rs 및 rt는 xs와 xt로 구성된 좌표별 순위 벡터입니다. 즉, rs = (rs1, rs2, ... rsn)입니다.

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

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

알고리즘

모두 축소

고속 유클리드 거리 알고리즘

fast로 시작하는 Distance 인수의 값(예: 'fasteuclidean''fastseuclidean')은 계산 시간을 아끼기 위해 추가 메모리를 사용하는 알고리즘을 사용해 유클리드 거리를 계산합니다. 이 알고리즘은 Albanie[1] 및 다른 문헌에서 "Euclidean Distance Matrix Trick"이라고 합니다. 내부 테스트에 따르면 이 알고리즘은 예측 변수 개수가 10개 이상인 경우 시간을 아끼는 것으로 나타났습니다.

각 xi가 n개의 변수를 갖는 모든 점 xi와 xj 간 거리의 행렬 D를 구하기 위해 알고리즘은 다음 수식의 마지막 줄을 사용하여 거리를 계산합니다.

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 이전에 개발됨

모두 확장