pdist
Distancia por pares entre pares de observaciones
Sintaxis
Descripción
devuelve la distancia usando el método especificado por D
= pdist(X
,Distance
,DistParameter
)Distance
y DistParameter
. Puede especificar DistParameter
solo cuando Distance
sea 'seuclidean'
, 'minkowski'
o 'mahalanobis'
.
D = pdist(
o X
,Distance
,CacheSize=cache
)D = pdist(
utiliza una caché con un tamaño de X
,Distance
,DistParameter
,CacheSize=cache
)cache
megabytes para acelerar el cálculo de distancias euclidianas. Este argumento se aplica solo cuando Distance
es 'fasteuclidean'
, 'fastsquaredeuclidean'
o 'fastseuclidean'
.
Ejemplos
Calcular la distancia euclidiana y convertir el vector de distancia en una matriz
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.
Calcular la distancia de Minkowski
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
Calcular la distancia por pares con elementos faltantes usando una función de distancia personalizada
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
Acelerar el cálculo de la distancia euclidiana usando la distancia fasteuclidean
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
X
— Datos de entrada
matriz numérica
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
Distance
— Métrica de distancia
vector de caracteres | escalar de cadena | identificador de función
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.
Valor | Descripció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, |
'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 |
'cityblock' | Distancia Manhattan |
'minkowski' | Distancia de Minkowski. El exponente predeterminado es 2. Use |
'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) |
@ | Identificador de función de la distancia personalizada. Una función de distancia tiene esta forma: function D2 = distfun(ZI,ZJ) % calculation of distance ...
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
DistParameter
— Valores del parámetro de una métrica de distancia
escalar positivo | vector numérico | matriz numérica
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 esstd(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 escov(X,'omitrows')
.DistParameter
debe ser simétrica y definida positiva.
Ejemplo: 'minkowski',3
Tipos de datos: single
| double
cache
— Tamaño de la matriz de Gram en megabytes
1e3
(predeterminado) | escalar positivo | "maximal"
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
D
— Distancias entre pares
vector fila numérico
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 i≤j.
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
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
La distancia euclidiana es un caso especial de la distancia de Minkowski, donde p = 2.
Distancia euclidiana estandarizada
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
donde C es la matriz de covarianzas.
Distancia Manhattan
La distancia Manhattan es un caso especial de la distancia de Minkowski, donde p = 1.
Distancia de Minkowski
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
La distancia de Chebyshov es un caso especial de la distancia de Minkowski, donde p = ∞.
Distancia del coseno
Distancia de correlación
donde
y .
Distancia de Hamming
Distancia de Jaccard
Distancia de Spearman
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).
.
.
Algoritmos
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:
La matriz 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
Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.
Notas y limitaciones de uso:
El valor del argumento de entrada de distancia (
Distance
) debe ser una constante en tiempo de compilación. Por ejemplo, para usar la distancia de Minkowski, incluyacoder.Constant('Minkowski')
en el valor-args
decodegen
.El valor del argumento de entrada de distancia (
Distance
) no puede ser una función de distancia personalizada.pdist
no admite la generación de código para cálculos rápidos de distancia euclidiana, lo que significa que no es compatible con las métricas de distancia cuyos nombres empiezan confast
(por ejemplo,'fasteuclidean'
).El código generado de
pdist
usaparfor
(MATLAB Coder) para crear bucles que se ejecutan en paralelo en las plataformas de núcleos múltiples de memoria compartida compatibles en el código generado. Si su compilador no es compatible con la interfaz de la aplicación de multiprocesamiento abierto (OpenMP) o desactiva la biblioteca OpenMP, MATLAB Coder™ trata los buclesparfor
como buclesfor
. Para encontrar compiladores compatibles, consulte compiladores compatibles. Para desactivar la biblioteca OpenMP, establezca la propiedadEnableOpenMP
del objeto de configuración comofalse
. Para obtener más detalles, consultecoder.CodeConfig
(MATLAB Coder).
Para obtener más información sobre la generación de código, consulte Introduction to Code Generation y General Code Generation Workflow.
Generación de código de GPU
Genere código CUDA® para GPU NVIDIA® mediante GPU Coder™.
Notas y limitaciones de uso:
Los argumentos de entrada de distancia compatibles (
Distance
) para el código CUDA optimizado son'euclidean'
,'squaredeuclidean'
,'seuclidean'
,'cityblock'
,'minkowski'
,'chebychev'
,'cosine'
,'correlation'
,'hamming'
y'jaccard'
.Distance
no puede ser una función de distancia personalizada.Distance
debe ser una constante en tiempo de compilación.
Arreglos GPU
Acelere código mediante la ejecución en una unidad de procesamiento gráfico (GPU) mediante Parallel Computing Toolbox™.
Notas y limitaciones de uso:
No puede especificar el argumento de entrada
Distance
como"fasteuclidean"
,"fastsquaredeuclidean"
,"fastseuclidean"
o una función de distancia personalizada.
Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Historial de versiones
Introducido antes de R2006aR2023a: Distancia euclidiana rápida usando una caché
Las métricas de distancia 'fasteuclidean'
, 'fastseuclidean'
y 'fastsquaredeuclidean'
aceleran el cálculo de las distancias euclidianas utilizando una caché y un algoritmo diferente (consulte Algoritmos). Establezca el tamaño de la caché utilizando el argumento cache
.
Consulte también
cluster
| clusterdata
| cmdscale
| cophenet
| dendrogram
| inconsistent
| linkage
| pdist2
| silhouette
| squareform
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de 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)