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

La distancia en parejas entre dos conjuntos de observaciones

Descripción

ejemplo

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

ejemplo

D = pdist2(X,Y,Distance,DistParameter) Devuelve la distancia mediante 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 por y devuelve las distancias en pares más pequeñas a las observaciones de cada observación en orden ascendente.D = pdist2(X,Y,Distance,'Smallest',K)DistanceKXY

  • calcula la distancia mediante la métrica especificada por y 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 mediante cualquiera de los argumentos de las sintaxis anteriores.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);

Calcule 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 en parejas entre la observación y la observación.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);

Calcule 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

Calcule la distancia Minkowski con un exponente de 1, que es igual a la distancia de bloque de 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 euclidiana más pequeñas a las observaciones en cada observación.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.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 en 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  

Calcule la distancia de 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 o la observación en contiene valores, la función vuelve para la distancia en 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 de Hamming.nanhamdistNaN Cuando se trabaja con un gran número de observaciones, se puede calcular la distancia más rápidamente mediante el bucle sobre 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;   

Calcule la distancia con pasando el identificador de función como un 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-significa clustering para dividir los 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 el uso.kmeans La función admite la generación de código de C/C++, por lo que puede generar código que acepte datos de entrenamiento y devuelva resultados de clustering y, a continuación, implementar 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 la formación y la predicción mediante y, respectivamente.kmeanspdist2

Se utiliza para crear clústeres en MATLAB® y utilizarlos en el código generado para asignar nuevos datos a los clústeres existentes.kmeanspdist2 Para la generación de código, defina una función de punto de entrada que acepte las posiciones de centroide de 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-significa clusteringk

Genere un conjunto de datos de entrenamiento con 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 utilizando.kmeans

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

Trace 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

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

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

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

Trace los datos de prueba y etiquete los datos de prueba utilizando.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 de centroide 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 pretende generar código para el algoritmo de MATLAB.%#codegen La adición de esta directiva indica al analizador de código de MATLAB que le ayudará a diagnosticar y corregir infracciones que provocarán 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 pulsa 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.

Genere código mediante.codegen Dado que C y C++ son lenguajes con tipos estáticos, debe determinar las propiedades de todas las variables en la función de punto de entrada en tiempo de compilación. Para especificar el tipo de datos y el tamaño de la matriz de las entradas, pase una expresión de 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.Especifique argumentos de tamaño variable para la generación de código

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 Logical 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.Flujo de trabajo de generación de código general Para obtener más información sobre el codificador de GPU, consulte y.Getting 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-por-matriz y es una-por-matriz.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 un vector de caracteres, un escalar de cadena o un identificador de función, como se describe en la tabla siguiente.

ValorDescripción
'euclidean'

Distancia euclidiana (por defecto).

'squaredeuclidean'

Distancia euclidiana cuadrada. (Esta opción se proporciona sólo para la eficiencia. No satisface la desigualdad triangular.)

'seuclidean'

Distancia euclidiana estandarizada. Cada diferencia de coordenadas entre las observaciones se escala dividiendo por el elemento correspondiente de la desviación estándar, S = nanstd(X). Se usa 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 positiva definida.DistParameterCC

'cityblock'

Distancia de bloque de ciudad.

'minkowski'

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

'chebychev'

Chebychev distancia (diferencia máxima de coordenadas).

'cosine'

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

'correlation'

Uno menos la correlación de 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 Jaccard, que es el porcentaje de coordenadas distintas de cero que difieren.

'spearman'

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

@distfun

Mango de función de distancia personalizado. Una función de distancia tiene la forma donde

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

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

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

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

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

Para las definiciones, vea.Las 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 usar estas métricas de la misma manera que las otras métricas con un valor predeterminado.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 sólo es válido cuando se especifica como, o.Distance'seuclidean''minkowski''mahalanobis'

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

  • Si es, es el exponente de 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étrico y positivo definitivo.nancov(X)DistParameter

Ejemplo: 'minkowski',3

Tipos de datos: single | double

Argumentos de par nombre-valor

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

Ejemplo: Ya sea o.'Smallest',K'Largest',K No puede usar ambos y.'Smallest''Largest'

Número de distancias más pequeñas que se han de encontrar, especificadas como el par separado por comas que consta de un entero positivo.'Smallest' Si se especifica, se ordenan las distancias en cada columna en orden ascendente.'Smallest'pdist2D

Ejemplo: 'Smallest',3

Tipos de datos: single | double

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

Ejemplo: 'Largest',3

Tipos de datos: single | double

Argumentos de salida

contraer todo

Distancias en parejas, devueltas como una matriz numérica.

Si no especifica ni, entonces es una-por-matriz, donde y es el número de observaciones en y, respectivamente. es la distancia entre la observación y la observación.'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 uno o como, entonces es a-por-Matrix. contiene las distancias más pequeñas o más grandes en pares a las observaciones de cada observación.'Smallest''Largest'KDKmyDKKXY Para cada observación en, encuentra las distancias más pequeñas o más grandes mediante la computación y comparando los valores de distancia a todas las observaciones en.Ypdist2KX Si es mayor que, devuelve un-por-Matrix.Kmxpdist2mxmy

Índice de ordenación, devuelto como una matriz de enteros positivos. es del mismo tamaño que. contiene los índices de las observaciones correspondientes a las distancias en.IDIXD

Más acerca de

contraer todo

Las métricas de distancia

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

Dada una matriz de datos, que se trata como (1-por-) vectores de filamxnXmxn X1, X2, ..., Xmx, y una matriz de datos, que se trata como (1-por-) vectores de filamynYmyn y1, y2, ...,ymy, las diferentes distancias entre el vector Xs 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),

    ¿Dónde está la matriz-por-diagonal cuyo elemento diagonal esVnnj (S(j))2, donde se encuentra un vector de factores de escalado para cada dimensión.S

  • Mahalanobis distancia

    dst2=(xsyt)C1(xsyt),

    donde está la matriz de covarianza.C

  • Distancia de bloque de ciudad

    dst=j=1n|xsjytj|.

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

  • Distancia Minkowski

    dst=j=1n|xsjytj|pp.

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

  • Chebychev distancia

    dst=maxj{|xsjytj|}.

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

  • La distancia del 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).

  • La distancia Jaccard

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

  • La 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 tomadox1j,x2j, ...Xmx,j, según lo calculado por.tiedrank

    • Rtj es el rango de ytj tomadoy1j,y2j, ...ymy,j, según lo calculado por.tiedrank

    • Rs Y Rt son los vectores de rango de coordenadas de Xs 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