Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

pdist

Distancia por pares entre pares de observaciones

Descripción

D = pdist(X) devuelve la distancia euclidiana entre pares de observaciones de X.

ejemplo

D = pdist(X,Distance) devuelve la distancia usando el método especificado por Distance.

ejemplo

D = pdist(X,Distance,DistParameter) devuelve la distancia usando el método especificado por Distance y DistParameter. Puede especificar DistParameter solo cuando Distance sea 'seuclidean', 'minkowski' o 'mahalanobis'.

ejemplo

D = pdist(X,Distance,CacheSize=cache) o D = pdist(X,Distance,DistParameter,CacheSize=cache) utiliza una caché con un tamaño de cache megabytes para acelerar el cálculo de distancias euclidianas. Este argumento se aplica solo cuando Distance es 'fasteuclidean', 'fastsquaredeuclidean' o 'fastseuclidean'.

ejemplo

Ejemplos

contraer todo

Calcule la distancia euclidiana entre pares de observaciones y convierta el vector de distancia en una matriz usando squareform.

Cree una matriz con tres observaciones y dos variables.

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

Calcule la distancia euclidiana.

D = pdist(X)
D = 1×3

    0.2954    1.0670    0.9448

Las distancias por pares se establecen en este orden: (2,1), (3,1), (3,2). Puede ubicar la distancia entre las observaciones i y j fácilmente usando squareform.

Z = squareform(D)
Z = 3×3

         0    0.2954    1.0670
    0.2954         0    0.9448
    1.0670    0.9448         0

squareform devuelve una matriz simétrica donde Z(i,j) corresponde a la distancia por pares entre las observaciones i y j. Por ejemplo, puede encontrar la distancia entre las observaciones 2 y 3.

Z(2,3)
ans = 0.9448

Pase Z a la función squareform para reproducir la salida de la función pdist.

y = squareform(Z)
y = 1×3

    0.2954    1.0670    0.9448

Las salidas y de squareform y D de pdist son la misma.

Cree una matriz con tres observaciones y dos variables.

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

Calcule la distancia de Minkowski con el exponente predeterminado 2.

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

    0.2954    1.0670    0.9448

Calcule la distancia de Minkowski con un exponente de 1, que es igual a la distancia Manhattan.

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

Establezca una función de distancia personalizada que ignore las coordenadas con valores NaN y calcule la distancia por pares usando esa función.

Cree una matriz con tres observaciones y dos variables.

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

Supongamos que el primer elemento de la primera observación no está presente.

X(1,1) = NaN;

Calcule la distancia euclidiana.

D1 = pdist(X)
D1 = 1×3

       NaN       NaN    0.9448

Si la observación i o j contienen valores NaN, la función pdist devuelve NaN para la distancia por pares entre i y j. Por tanto, D1(1), D1(2) y las distancias por pares (2,1) y (3,1) son valores NaN.

Establezca una función de distancia personalizada naneucdist que ignore las coordenadas con valores NaN y devuelva la distancia euclidiana.

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

Calcule la distancia con naneucdist pasando el identificador de la función como un argumento de entrada de pdist.

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

    0.3974    1.1538    0.9448

Cree una matriz grande de puntos y, luego, mida el tiempo utilizado por pdist con la métrica de distancia predeterminada "euclidean".

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

A continuación, mida el tiempo utilizado por pdist con la métrica de distancia "fasteuclidean". Especifique un tamaño de caché de 10.

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

Evalúe por qué factor es más rápido el cálculo acelerado en comparación con el estándar.

standard/accelerated
ans = 6.6380

En este ejemplo, la versión acelerada calcula aproximadamente tres veces más rápido.

Argumentos de entrada

contraer todo

Datos de entrada, especificados como una matriz numérica con un tamaño de m por n. Las filas corresponden a observaciones individuales, mientras que las columnas corresponden a variables individuales.

Tipos de datos: single | double

Métrica de distancia, especificada como un vector de caracteres, un escalar de cadena o un identificador de función, tal y como se describe en la tabla siguiente.

ValorDescripción
'euclidean'

Distancia euclidiana (valor predeterminado)

'squaredeuclidean'

Distancia euclidiana cuadrada. (Esta opción solo se ofrece para mejorar la eficiencia. No resuelve la desigualdad triangular).

'seuclidean'

Distancia euclidiana estandarizada. Cada diferencia de las coordenadas entre las observaciones se escala dividiendo por el elemento correspondiente de la desviación estándar, S = std(X,'omitnan'). Use DistParameter para especificar un valor distinto de S.

'fasteuclidean'Distancia euclidiana calculada utilizando un algoritmo alternativo que ahorra tiempo cuando el número de predictores es al menos 10. En algunos casos, este algoritmo más rápido puede reducir la precisión. Los algoritmos que empiezan con 'fast' no admiten datos dispersos. Para obtener más detalles, consulte Algoritmos.
'fastsquaredeuclidean'Distancia euclidiana cuadrada calculada utilizando un algoritmo alternativo que ahorra tiempo cuando el número de predictores es al menos 10. En algunos casos, este algoritmo más rápido puede reducir la precisión. Los algoritmos que empiezan con 'fast' no admiten datos dispersos. Para obtener más detalles, consulte Algoritmos.
'fastseuclidean'Distancia euclidiana estandarizada calculada utilizando un algoritmo alternativo que ahorra tiempo cuando el número de predictores es al menos 10. En algunos casos, este algoritmo más rápido puede reducir la precisión. Los algoritmos que empiezan con 'fast' no admiten datos dispersos. Para obtener más detalles, consulte Algoritmos.
'mahalanobis'

Distancia de Mahalanobis, calculada usando la covarianza de muestra de X, C = cov(X,'omitrows'). Use DistParameter para especificar un valor distinto de C, donde la matriz C es simétrica y definida positiva.

'cityblock'

Distancia Manhattan

'minkowski'

Distancia de Minkowski. El exponente predeterminado es 2. Use DistParameter para especificar un exponente diferente P, donde P es un valor de escalar positivo del exponente.

'chebychev'

Distancia de Chebyshov (diferencia de coordenada máxima)

'cosine'

Uno menos el coseno del ángulo incluido entre puntos (tratados como vectores)

'correlation'

Uno menos la correlación de la muestra entre los puntos (tratados como secuencias de valores)

'hamming'

Distancia de Hamming, que es el porcentaje de coordenadas que difieren

'jaccard'

Uno menos el coeficiente de Jaccard, que es el porcentaje de coordenadas, que no son cero, que difieren

'spearman'

Uno menos la correlación del coeficiente de Spearman entre observaciones (tratadas como secuencias de valores)

@distfun

Identificador de función de la distancia personalizada. Una función de distancia tiene esta forma:

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
donde

  • ZI es un vector de 1 por n que contiene una sola observación.

  • ZJ es una matriz de m2 por n que contiene varias observaciones. distfun debe aceptar una matriz ZJ con un número arbitrario de observaciones.

  • D2 es un vector de distancias de m2 por 1, mientras que D2(k) corresponde a la distancia entre las observaciones ZI y ZJ(k,:).

Si sus datos no son dispersos, por lo general, podrá calcular las distancias más rápido usando una métrica de distancia integrada en lugar de un identificador de función.

Para ver las definiciones, consulte Métricas de distancia.

Cuando use 'seuclidean', 'minkowski' o 'mahalanobis', podrá especificar un argumento de entrada adicional DistParameter para controlar estas métricas. También puede usar estas métricas de la misma manera que el resto de métricas con el valor predeterminado de DistParameter.

Ejemplo: 'minkowski'

Tipos de datos: char | string | function_handle

Los valores del parámetro de una métrica de distancia, especificados como un escalar positivo, un vector numérico o una matriz numérica. Este argumento solo es válido cuando se especifica Distance como 'seuclidean', 'minkowski' o 'mahalanobis'.

  • Si Distance es 'seuclidean', DistParameter es un vector de factores de escalado de cada dimensión, especificado como un vector positivo. El valor predeterminado es std(X,'omitnan').

  • Si Distance es 'minkowski', DistParameter es el exponente de la distancia de Minkowski, especificado como un escalar positivo. El valor predeterminado es 2.

  • Si Distance es 'mahalanobis', DistParameter es una matriz de covarianzas, especificada cono una matriz numérica. El valor predeterminado es cov(X,'omitrows'). DistParameter debe ser simétrica y definida positiva.

Ejemplo: 'minkowski',3

Tipos de datos: single | double

Tamaño de la matriz de Gram en megabytes, especificado como un escalar positivo o "maximal". La función pdist puede usar CacheSize=cache solo cuando el argumento Distance es 'fasteuclidean', 'fastsquaredeuclidean' o 'fastseuclidean'.

Si cache es "maximal", pdist intenta asignar suficiente memoria para una matriz intermedia entera cuyo tamaño es M por M, donde M es el número de filas de los datos de entrada X. El tamaño de la caché no tiene que ser lo suficientemente grande para una matriz intermedia completa, pero debe ser al menos lo suficientemente grande como para contener un vector de M por 1. De lo contrario, pdist usa el algoritmo estándar para calcular distancias euclidianas.

Si el argumento de la distancia es 'fasteuclidean', 'fastsquaredeuclidean' o 'fastseuclidean' y el valor de cache es demasiado grande o "maximal", pdist puede intentar asignar una matriz de Gram que supere la memoria disponible. En este caso, MATLAB® muestra un error.

Ejemplo: "maximal"

Tipos de datos: double | char | string

Argumentos de salida

contraer todo

Distancias entre pares, devueltas como un vector fila numérico con una longitud de m(m–1)/2, correspondiente a los pares de observaciones, donde m es el número de observaciones de X.

Las distancias se fijan en el orden (2,1), (3,1), ..., (m,1), (3,2), ..., (m,2), ..., (m,m–1), es decir, el triángulo inferior inzquierdo de la matriz de distancia de m por m en el orden de la columna. La distancia por pares entre las observaciones i y j está en D((i-1)*(m-i/2)+j-i) de ij.

Puede convertir D en una matriz simétrica usando la función squareform. Z = squareform(D) devuelve una matriz de m por m donde Z(i,j) corresponde a la distancia por pares entre las observaciones i y j.

Si las observaciones i o j contienen valores NaN, el valor correspondiente de D es NaN para las funciones de distancia integradas.

D se suele usar como una matriz de diferenciación en la creación de clusters o en el escalado multidimensional. Para obtener más información, consulte Hierarchical Clustering y las páginas de referencia de las funciones cmdscale, cophenet, linkage, mdscale y optimalleaforder. Estas funciones toman D como un argumento de entrada.

Más acerca de

contraer todo

Métricas de distancia

Una métrica de distancia es una función que define la distancia entre dos observaciones. pdist admite varias métricas de distancia: distancia euclidiana, distancia euclidiana estandarizada, distancia de Mahalanobis, distancia Manhattan, distancia de Minkowski, distancia de Chebyshov, distancia del coseno, distancia de correlación, distancia de Hamming, distancia de Jaccard y distancia de Spearman.

Si tenemos una matriz de datos de m por n X, que se trata como vectores fila m (1 por n) x1, x2, ..., xm, las diferentes distancias entre el vector xs y xt se definen de esta manera:

  • Distancia euclidiana

    dst2=(xsxt)(xsxt).

    La distancia euclidiana es un caso especial de la distancia de Minkowski, donde p = 2.

  • Distancia euclidiana estandarizada

    dst2=(xsxt)V1(xsxt),

    donde V es la matriz diagonal de n por n cuyo elemento diagonal número j es (S(j))2, donde S es un vector de factores de escalado de cada dimensión.

  • Distancia de Mahalanobis

    dst2=(xsxt)C1(xsxt),

    donde C es la matriz de covarianzas.

  • Distancia Manhattan

    dst=j=1n|xsjxtj|.

    La distancia Manhattan es un caso especial de la distancia de Minkowski, donde p = 1.

  • Distancia de Minkowski

    dst=j=1n|xsjxtj|pp.

    Para el caso especial de p = 1, la distancia de Minkowski ofrece la distancia Manhattan. Para el caso especial de p = 2, la distancia de Minkowski ofrece la distancia euclidiana. Para el caso especial de p = ∞, la distancia de Minkowski ofrece la distancia de Chebyshov.

  • Distancia de Chebyshov

    dst=maxj{|xsjxtj|}.

    La distancia de Chebyshov es un caso especial de la distancia de Minkowski, donde p = ∞.

  • Distancia del coseno

    dst=1xsxt(xsxs)(xtxt).

  • Distancia de correlación

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

    donde

    x¯s=1njxsj y x¯t=1njxtj.

  • Distancia de Hamming

    dst=(#(xsjxtj)/n).

  • Distancia de Jaccard

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

  • Distancia de Spearman

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

    donde

    • rsj es el rango de xsj llevado a x1j, x2j, ...xmj, tal y como lo calcula tiedrank.

    • rs y rt son los vectores rango basados en coordenadas de xs y xt, es decir, rs = (rs1, rs2, ... rsn).

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

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

Algoritmos

contraer todo

Algoritmo de distancia euclidiana rápida

Los valores del argumento Distance que empiezan con fast (como 'fasteuclidean' y 'fastseuclidean') calculan distancias euclidianas utilizando un algoritmo que utiliza memoria adicional para ahorrar tiempo de cálculo. Este algoritmo se denomina "Euclidean Distance Matrix Trick" en Albanie [1] y en otros lugares. Las pruebas internas muestran que este algoritmo ahorra tiempo cuando el número de predictores es al menos 10.

Para encontrar la matriz D de distancias entre todos los puntos xi y xj, donde cada xi tiene n variables, el algoritmo calcula la distancia usando la línea final de las ecuaciones siguientes:

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

La matriz xiTxj de la última línea de las ecuaciones se denominada la matriz de Gram. Cuando se calcula y se utiliza la matriz de Gram en lugar de calcular las distancias al cuadrado mediante el cuadrado y la suma, calcular el conjunto de distancias cuadradas es más rápido, pero ligeramente menos estable numéricamente. Para obtener más información, consulte Albanie [1].

Para almacenar la matriz de Gram, el software usa una caché con el tamaño predeterminado de 1e3 megabytes. Puede establecer el tamaño de la caché utilizando el argumento cache. Si el valor de cache es demasiado grande o "maximal", pdist puede intentar asignar una matriz de Gram que supere la memoria disponible. En este caso, MATLAB muestra un error.

Referencias

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

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo