Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

pdist2

Distancia por pares entre dos conjuntos de observaciones

Descripción

ejemplo

D = pdist2(X,Y,Distance) devuelve la distancia entre cada par de observaciones y utilizando la métrica especificada por .XYDistance

ejemplo

D = pdist2(X,Y,Distance,DistParameter) devuelve la distancia utilizando la métrica especificada por y .DistanceDistParameter Solo puede especificar cuándo es , , o .DistParameterDistance'seuclidean''minkowski''mahalanobis'

D = pdist2(___,Name,Value) especifica una opción adicional mediante uno de los argumentos de par nombre-valor o además de cualquiera de los argumentos de las sintaxis anteriores.'Smallest''Largest'

Por ejemplo,

  • calcula la distancia utilizando la métrica especificada y devuelve las distancias más pequeñas por pares a las observaciones de cada observación en orden ascendente.D = pdist2(X,Y,Distance,'Smallest',K)DistanceKXY

  • calcula la distancia utilizando la métrica especificada y devuelve las distancias en pares más grandes en orden descendente.D = pdist2(X,Y,Distance,DistParameter,'Largest',K)DistanceDistParameterK

ejemplo

[D,I] = pdist2(___,Name,Value) también devuelve la matriz .I La matriz contiene los índices de las observaciones correspondientes a las distancias en .IXD

Ejemplos

contraer todo

Cree dos matrices con tres observaciones y dos variables.

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

Calcular la distancia euclidiana. El valor predeterminado del argumento de entrada es .Distance'euclidean' Al calcular la distancia euclidiana sin utilizar un argumento de par nombre-valor, no es necesario especificar .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

corresponde a la distancia por pares entre la observación en y la observación en .D(i,j)iXjY

Cree dos matrices con tres observaciones y dos variables.

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

Calcula la distancia de Minkowski con el exponente predeterminado 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

Calcular la distancia Minkowski con un exponente de 1, que es igual a la distancia de la manzana de la ciudad.

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

Cree dos matrices con tres observaciones y dos variables.

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

Encuentre las dos distancias euclidianas más pequeñas en pares a las observaciones en para cada observación en .XY

[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

Para cada observación en , encuentra las dos distancias más pequeñas calculando y comparando los valores de distancia con todas las observaciones en .Ypdist2X A continuación, la función ordena las distancias en cada columna en orden ascendente. contiene los índices de las observaciones correspondientes a las distancias en .DIXD

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

Cree dos matrices con tres observaciones y tres variables.

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  

Las dos primeras columnas de X e Y son idénticas. Supongamos que falta.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  

Calcula la distancia hamming.

D1 = pdist2(X,Y,'hamming') 
 D1 =         NaN       NaN       NaN     1.0000    0.3333    1.0000     1.0000    1.0000    0.3333  

Si la observación en u observación en contiene valores, la función devuelve para la distancia por pares entre y .iXjYNaNpdist2NaNij Por lo tanto, D1(1,1), D1(1,2) y D1(1,3) son valores.NaN

Defina una función de distancia personalizada que ignore las coordenadas con valores y calcule la distancia Hamming.nanhamdistNaN Al trabajar con un gran número de observaciones, puede calcular la distancia más rápidamente recorriendo las coordenadas de los datos.

 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;   

Calcular la distancia pasando el identificador de función como argumento de entrada de .nanhamdistpdist2

D2 = pdist2(X,Y,@nanhamdist) 
 D2 =      0.5000    1.0000    1.0000     1.0000    0.3333    1.0000     1.0000    1.0000    0.3333  

realiza -means clustering para particionar datos en clústeres.kmeanskk Cuando tiene un nuevo conjunto de datos en el clúster, puede crear nuevos clústeres que incluyan los datos existentes y los nuevos datos mediante .kmeans La función admite la generación de código C/C++, por lo que puede generar código que acepte datos de entrenamiento y devuelva resultados de agrupación en clústeres y, a continuación, implemente el código en un dispositivo.kmeans En este flujo de trabajo, debe pasar los datos de entrenamiento, que pueden ser de un tamaño considerable. Para ahorrar memoria en el dispositivo, puede separar el entrenamiento y la predicción mediante y , respectivamente.kmeanspdist2

Se utiliza para crear clústeres en MATLAB® y utilizar en el código generado para asignar nuevos datos a clústeres existentes.kmeanspdist2 Para la generación de código, defina una función de punto de entrada que acepte las posiciones centroide del clúster y el nuevo conjunto de datos, y devuelva el índice del clúster más cercano. A continuación, genere código para la función de punto de entrada.

La generación de código C/C++ requiere MATLAB® Coder™.

Realizar -Mediaclusteringk

Genere un conjunto de datos de entrenamiento mediante tres distribuciones.

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

Particione los datos de entrenamiento en tres clústeres mediante .kmeans

[idx,C] = kmeans(X,3);

Trazar los clústeres y los centroides del clúster.

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

Asignar nuevos datos a clústeres existentes

Generar un conjunto de datos de prueba.

Xtest = [randn(10,2)*0.75+ones(10,2);     randn(10,2)*0.5-ones(10,2);     randn(10,2)*0.75];

Clasificar el conjunto de datos de prueba mediante los clústeres existentes. Busque el centroide más cercano de cada punto de datos de prueba utilizando .pdist2

[~,idx_test] = pdist2(C,Xtest,'euclidean','Smallest',1);

Trazar los datos de prueba y etiquetar los datos de prueba mediante .idx_testgscatter

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

Generar código

Genere código C que asigne nuevos datos a los clústeres existentes. Tenga en cuenta que la generación de código C/C++ requiere MATLAB® Coder™.

Defina una función de punto de entrada denominada que acepte posiciones centroides y nuevos datos y, a continuación, busque el clúster más cercano mediante .findNearestCentroidpdist2

Agregue la directiva del compilador (o pragma) a la función de punto de entrada después de la firma de la función para indicar que tiene la intención de generar código para el algoritmo MATLAB.%#codegen Al agregar esta directiva, se indica al analizador de códigos de MATLAB que le ayude a diagnosticar y corregir infracciones que provocarían errores durante la generación de código.

type findNearestCentroid % Display contents of findNearestCentroid.m
function idx = findNearestCentroid(C,X) %#codegen [~,idx] = pdist2(C,X,'euclidean','Smallest',1); % Find the nearest centroid 

Si hace clic en el botón situado en la sección superior derecha de esta página y abre este ejemplo en MATLAB®, MATLAB® abre la carpeta de ejemplo.Nota: Esta carpeta incluye el archivo de función de punto de entrada.

Generar código mediante .codegen (MATLAB Coder) Dado que C y C++ son lenguajes con tipo estático, debe determinar las propiedades de todas las variables de la función de punto de entrada en tiempo de compilación. Para especificar el tipo de datos y el tamaño de matriz de las entradas de , pase una expresión MATLAB que represente el conjunto de valores con un determinado tipo de datos y tamaño de matriz mediante la opción.findNearestCentroid-args Para obtener más información, consulte .Specify Variable-Size Arguments for Code Generation

codegen findNearestCentroid -args {C,Xtest}
 

genera la función MEX con una extensión dependiente de la plataforma.codegenfindNearestCentroid_mex

Compruebe el código generado.

myIndx = findNearestCentroid(C,Xtest); myIndex_mex = findNearestCentroid_mex(C,Xtest); verifyMEX = isequal(idx_test,myIndx,myIndex_mex)
verifyMEX = logical
   1

devuelve lógico 1 ( ), lo que significa que todas las entradas son iguales.isequaltrue La comparación confirma que la función, la función y la función MEX devuelven el mismo índice.pdist2findNearestCentroid

También puede generar código CUDA® optimizado mediante GPU Coder™.

cfg = coder.gpuConfig('mex'); codegen -config cfg findNearestCentroid -args {C,Xtest} 

Para obtener más información sobre la generación de código, consulte .General Code Generation Workflow Para obtener más información sobre el codificador de GPU, consulte y .Get Started with GPU Coder (GPU Coder)Supported Functions (GPU Coder)

Argumentos de entrada

contraer todo

Datos de entrada, especificados como una matriz numérica. es una matriz -por- y es una matriz -por-.XmxnYmyn Las filas corresponden a observaciones individuales y las columnas corresponden a variables individuales.

Tipos de datos: single | double

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

ValorDescripción
'euclidean'

Distancia euclidiana (predeterminada).

'squaredeuclidean'

Distancia euclidiana cuadrada. (Esta opción se proporciona solo para eficiencia. No satisface la desigualdad del triángulo.)

'seuclidean'

Distancia euclidiana estandarizada. Cada diferencia de coordenadas entre observaciones se escala dividiendo por el elemento correspondiente de la desviación estándar, S = nanstd(X). Se utiliza para especificar otro valor para .DistParameterS

'mahalanobis'

Mahalanobis distancia utilizando la covarianza de muestra de ,X C = nancov(X). Se utiliza para especificar otro valor para , donde la matriz es simétrica y definida positivamente.DistParameterCC

'cityblock'

Distancia del bloque de la ciudad.

'minkowski'

Distancia de Minkowski. El exponente predeterminado es 2. Se utiliza para especificar un exponente diferente, donde hay un valor escalar positivo del exponente.DistParameterPP

'chebychev'

Distancia de Chebychev (diferencia máxima de coordenadas).

'cosine'

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

'correlation'

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

'hamming'

Distancia de hamming, que es el porcentaje de coordenadas que difieren.

'jaccard'

Uno menos el coeficiente Jaccard, que es el porcentaje de coordenadas distintas de cero que difieren.

'spearman'

Uno menos la correlación de rango de Spearman de la muestra entre las observaciones (tratadas como secuencias de valores).

@distfun

Mango de función de distancia personalizada. Una función de distancia tiene la forma en la que

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

  • es un vector -por- que contiene una sola observación.ZI1n

  • es una matriz por- que contiene múltiples observaciones. debe aceptar una matriz con un número arbitrario de observaciones.ZJm2ndistfunZJ

  • es un vector -por- de distancias, y es la distancia entre las observaciones y .D2m21D2(k)ZIZJ(k,:)

Si los datos no son dispersos, generalmente puede calcular la distancia más rápidamente mediante una distancia integrada en lugar de un identificador de función.

Para obtener definiciones, consulte .Métricas de distancia

Cuando utilice , , o , puede especificar un argumento de entrada adicional para controlar estas métricas.'seuclidean''minkowski''mahalanobis'DistParameter También puede utilizar estas métricas de la misma manera que las otras métricas con un valor predeterminado de .DistParameter

Ejemplo: 'minkowski'

Valores de parámetro de 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 como , , o .Distance'seuclidean''minkowski''mahalanobis'

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

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

  • Si es , es una matriz de covarianza, especificada como una matriz numérica.Distance'mahalanobis'DistParameter El valor predeterminado es . debe ser simétrica y positiva definitiva.nancov(X)DistParameter

Ejemplo: 'minkowski',3

Tipos de datos: single | double

Argumentos de par nombre-valor

Especifique pares opcionales separados por comas de argumentos. es el nombre del argumento y es el valor correspondiente. deben aparecer entre comillas.Name,ValueNameValueName Puede especificar varios argumentos de par de nombre y valor en cualquier orden como .Name1,Value1,...,NameN,ValueN

Ejemplo: O .'Smallest',K'Largest',K No se pueden utilizar ambos y .'Smallest''Largest'

Número de distancias más pequeñas para buscar, especificado como el par separado por comas que consta de y un entero positivo.'Smallest' Si especifica , ordena las distancias en cada columna de en orden ascendente.'Smallest'pdist2D

Ejemplo: 'Smallest',3

Tipos de datos: single | double

Número de distancias más grandes para buscar, especificado como el par separado por comas que consta de y un entero positivo.'Largest' Si especifica , ordena las distancias en cada columna de en orden descendente.'Largest'pdist2D

Ejemplo: 'Largest',3

Tipos de datos: single | double

Argumentos de salida

contraer todo

Distancias por pares, devueltas como una matriz numérica.

Si no especifica o , entonces es una matriz -by-, donde y son el número de observaciones en y , respectivamente. es la distancia entre la observación y la observación en .'Smallest''Largest'DmxmymxmyXYD(i,j)iXjY Si la observación en o la observación en contiene , entonces es para las funciones de distancia incorporadas.iXjYNaND(i,j)NaN

Si especifica una o como , entonces es una matriz -by-. contiene las distancias por pares más pequeñas o más grandes a las observaciones en cada observación en .'Smallest''Largest'KDKmyDKKXY Para cada observación en , encuentra las distancias más pequeñas o más grandes calculando y comparando los valores de distancia con todas las observaciones en .Ypdist2KX Si es mayor que , devuelve una matriz -by-.Kmxpdist2mxmy

Ordenar índice, devuelto como una matriz de enteros positivo. es del mismo tamaño que . contiene los índices de las observaciones correspondientes a las distancias en .IDIXD

Más acerca de

contraer todo

Métricas de distancia

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

Dada una matriz de datos -por-, que se trata como vectores de fila (1 por)mxnXmxn X1, X2, ..., Xmx, y una matriz de datos -por-, que se trata como vectores de fila (1 por )mynYmyn y y1, y y2, ...,y ymy, las distintas distancias entre el vector Xs Y y yt se definen de la siguiente manera:

  • Distancia euclidiana

    dst2=(xsyt)(xsyt).

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

  • Distancia euclidiana estandarizada

    dst2=(xsyt)V1(xsyt),

    donde está la matriz diagonal -por- cuyo elemento diagonal esVnnj (S(j))2, donde hay un vector de factores de escala para cada dimensión.S

  • Distancia Mahalanobis

    dst2=(xsyt)C1(xsyt),

    donde está la matriz de covarianza.C

  • Distancia del bloque de la ciudad

    dst=j=1n|xsjytj|.

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

  • Distancia de Minkowski

    dst=j=1n|xsjytj|pp.

    Para el caso especial de p = 1, la distancia de Minkowski da a la manzana de la ciudad distancia. Para el caso especial de p = 2, la distancia De Minkowski da la distancia euclidiana. Para el caso especial de p = ∞, la distancia de Minkowski da la distancia Chebychev.

  • Distancia de Chebychev

    dst=maxj{|xsjytj|}.

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

  • Distancia coseno

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

  • Distancia de correlación

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

    Dónde

    x¯s=1njxsj

    Y

    y¯t=1njytj.

  • Distancia de Hamming

    dst=(#(xsjytj)/n).

  • Distancia Jaccard

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

  • Distancia de Spearman

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

    Dónde

    • Rsj es el rango de Xsj tomado el controlx1j, x2j, ...Xmx,j, calculado por .tiedrank

    • Rtj es el rango de y ytj tomado el controly1j, y2j, ...y ymy,j, calculado por .tiedrank

    • Rs Y Rt son los vectores de rango coordinado de Xs Y y ytI.e. Rs = (Rs1, Rs2, ... Rsn) y Rt = (rt1, rt2, ... Rtn).

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

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

Capacidades ampliadas

Introducido en R2010a