¿Cómo calcular distancias con coordenadas?

Cálculo de Distancia Euclidiana en MATLAB

21/05/2026

Valoración: 4.79 (8633 votos)

La distancia euclidiana es uno de los conceptos fundamentales en matemáticas y ciencias de la computación, especialmente en el campo del análisis de datos, el aprendizaje automático y la visión por computadora. Representa la distancia "en línea recta" entre dos puntos en un espacio euclidiano, y es la medida de distancia más comúnmente utilizada. En MATLAB, una herramienta poderosa para el cálculo numérico, existen funciones específicas que facilitan enormemente la implementación de este cálculo, permitiendo a los usuarios realizar tareas complejas como la clasificación de datos o la creación de sistemas de reconocimiento de patrones de manera eficiente. Este artículo explorará cómo calcular la distancia euclidiana en MATLAB, centrándose en la función pdist2 y su aplicación en escenarios prácticos como la asignación de nuevos datos a clusters preexistentes, incluso con la ventaja de la generación de código optimizado.

¿Cómo calcular la distancia euclidiana en Matlab?
Calcular la distancia euclidiana Crea dos matrices con tres observaciones y dos variables. rng('default') % Para reproducibilidad: X = rand(3,2); Y = rand(3,2); Calcula la distancia euclidiana. El valor predeterminado del argumento de entrada "Distancia" es 'euclidean'.

¿Qué es la Distancia Euclidiana?

En su esencia más simple, la distancia euclidiana es la longitud de un segmento de línea que conecta dos puntos. En un plano bidimensional, si tenemos dos puntos P1 = (x1, y1) y P2 = (x2, y2), la distancia euclidiana entre ellos se calcula utilizando el teorema de Pitágoras:

Distancia = √((x2 - x1)² + (y2 - y1)²)

Esta fórmula se extiende fácilmente a espacios de dimensiones superiores. Para dos puntos P = (p1, p2, ..., pn) y Q = (q1, q2, ..., qn) en un espacio n-dimensional, la distancia euclidiana es:

Distancia = √((p1 - q1)² + (p2 - q2)² + ... + (pn - qn)²)

La distancia euclidiana es intuitiva y ampliamente utilizada porque cumple con las propiedades de una métrica: es no negativa, simétrica, y satisface la desigualdad triangular. Es particularmente útil en algoritmos donde la "similitud" o "proximidad" entre puntos de datos es clave, como en la agrupación (clustering), la clasificación, y la recuperación de información.

K-means Clustering y la Necesidad de Distancia

El algoritmo K-means es uno de los métodos de clustering más populares y sencillos. Su objetivo es particionar 'n' observaciones en 'k' clusters, donde cada observación pertenece al cluster cuyo centroide (media) es el más cercano. La "cercanía" se define precisamente por una medida de distancia, siendo la distancia euclidiana la elección por defecto y más común.

En MATLAB, la función kmeans implementa este algoritmo. Cuando se entrena un modelo K-means, se le proporcionan los datos de entrenamiento y el número deseado de clusters (k). La función devuelve los índices de cluster para cada punto de datos y las posiciones de los centroides de los clusters. Estos centroides son, en esencia, los "representantes" de cada grupo y son cruciales para clasificar nuevos datos.

Entrenamiento de K-means en MATLAB

Para demostrar el proceso, primero generaremos un conjunto de datos de entrenamiento que simule la existencia de tres grupos distintos. Utilizaremos la función randn para generar datos aleatorios de una distribución normal, ajustándolos para crear la separación deseada.

rng('default'); % Para reproducibilidad de los resultados X = [randn(100,2)*0.75+ones(100,2); randn(100,2)*0.5-ones(100,2); randn(100,2)*0.75]; 

Aquí, rng('default') asegura que, cada vez que ejecutes el código, obtendrás los mismos números aleatorios, lo cual es fundamental para la reproducibilidad de tus experimentos. Luego, X se construye concatenando tres conjuntos de 100 puntos bidimensionales, cada uno con una distribución ligeramente diferente.

Una vez que tenemos los datos, podemos aplicar kmeans para encontrar los clusters:

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

En esta línea, kmeans(X,3) particiona los datos en 3 clusters. idx contendrá el índice del cluster al que pertenece cada punto de X, y C será una matriz donde cada fila representa las coordenadas del centroide de un cluster.

Para visualizar los resultados, podemos usar gscatter:

figure gscatter(X(:,1),X(:,2),idx,'bgm') hold on plot(C(:,1),C(:,2),'kx') legend('Cluster 1','Cluster 2','Cluster 3','Centroide del Cluster') 

gscatter es una función muy útil en MATLAB para crear gráficos de dispersión donde los puntos se agrupan por color según una variable de grupo (en este caso, idx). Los centroides se añaden con plot, marcados con una 'x' negra.

Asignación de Nuevos Datos con pdist2: Eficiencia y Precisión

Una vez que hemos entrenado nuestro modelo K-means y obtenido los centroides (C), la pregunta clave es: ¿cómo clasificamos un nuevo conjunto de datos sin tener que reentrenar el algoritmo completo? Aquí es donde entra en juego la función pdist2.

Mientras que kmeans es excelente para el entrenamiento inicial, reejecutarlo con datos nuevos y existentes puede ser ineficiente, especialmente si los datos originales son muy grandes. La función pdist2 está diseñada para calcular distancias entre cada par de puntos en dos conjuntos de datos, lo que la hace perfecta para la tarea de asignación.

pdist2(X1, X2, 'metric') calcula la distancia entre cada fila de X1 y cada fila de X2 utilizando la métrica especificada. Para la distancia euclidiana, simplemente especificamos 'euclidean'.

Generemos un nuevo 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]; 

Ahora, para clasificar estos nuevos puntos en los clusters existentes, necesitamos encontrar el centroide más cercano a cada punto en Xtest. Aquí es donde pdist2 brilla:

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

Analicemos esta línea crucial:

  • C: Son los centroides de nuestros clusters existentes (las "referencias").
  • Xtest: Son los nuevos puntos que queremos clasificar.
  • 'euclidean': Especifica que queremos calcular la distancia euclidiana.
  • 'Smallest': Este argumento indica que estamos interesados en los valores de distancia más pequeños.
  • 1: Este argumento, combinado con 'Smallest', significa que queremos encontrar la primera (y única) distancia más pequeña para cada punto.

La función pdist2 devuelve dos argumentos cuando se utiliza con 'Smallest' y el número de elementos: el primer argumento (ignoramos con ~) serían las distancias mínimas, y el segundo argumento, idx_test, es un vector que contiene el índice del centroide más cercano para cada punto en Xtest. Este índice corresponde directamente al cluster al que debe asignarse el punto de prueba.

Para visualizar la clasificación de los nuevos datos:

gscatter(Xtest(:,1),Xtest(:,2),idx_test,'bgm','ooo') legend('Cluster 1','Cluster 2','Cluster 3','Centroide del Cluster', ... 'Datos clasificados al Cluster 1','Datos clasificados al Cluster 2', ... 'Datos clasificados al Cluster 3') 

Aquí, los puntos de prueba se representan con círculos ('ooo') para distinguirlos de los datos de entrenamiento originales.

Generación de Código C/C++ para Optimización con MATLAB Coder

Uno de los mayores beneficios de usar funciones de MATLAB como pdist2 es su compatibilidad con la generación de código. Si tu aplicación requiere un rendimiento extremadamente alto o necesitas desplegar tu algoritmo en un dispositivo embebido con recursos de memoria limitados, puedes generar código C/C++ a partir de tu script de MATLAB. Esto se logra con MATLAB Coder, una herramienta que convierte automáticamente código MATLAB en código C/C++ legible y optimizado.

El flujo de trabajo es particularmente útil cuando los datos de entrenamiento son considerables. En lugar de pasar todos los datos de entrenamiento al dispositivo, solo necesitas pasar los centroides calculados por kmeans en MATLAB. Luego, el código generado que utiliza pdist2 puede manejar la asignación de nuevos datos directamente en el dispositivo.

Para generar código, primero debes definir una función de punto de entrada. Esta función será la que se convertirá a C/C++. Para nuestro caso, crearemos una función llamada findNearestCentroid:

function idx = findNearestCentroid(C,X) %#codegen % FINDNEARESTCENTROID Encuentra el centroide más cercano para cada punto. % idx = findNearestCentroid(C,X) devuelve el índice del centroide más cercano % para cada fila de X, dada la matriz de centroides C. [~,idx] = pdist2(C,X,'euclidean','Smallest',1); % Encuentra el centroide más cercano end 

La directiva %#codegen es crucial. Le indica al Analizador de Código de MATLAB que esta función está destinada a la generación de código, ayudando a identificar posibles problemas de compatibilidad antes de la compilación.

Ahora, para generar el código, usamos el comando codegen:

codegen findNearestCentroid -args {C,Xtest} 

El argumento -args {C,Xtest} es vital porque MATLAB Coder necesita saber los tipos de datos y los tamaños (o si son variables) de las entradas de la función en tiempo de compilación, ya que C/C++ son lenguajes de tipado estático. Aquí, C y Xtest se usan como ejemplos para inferir los tipos y tamaños de las entradas esperadas.

Si la generación de código es exitosa, codegen creará un archivo MEX (MATLAB Executable) con un nombre como findNearestCentroid_mex (la extensión dependerá de tu plataforma). Este archivo MEX es una función compilada que puede ser llamada directamente desde MATLAB, pero que ejecuta código C/C++ subyacente, ofreciendo un rendimiento significativamente mejor que el código MATLAB interpretado.

Verificación del Código Generado

Es una buena práctica verificar que el código generado produce los mismos resultados que el código MATLAB original.

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

La función isequal compara las salidas de la función MATLAB original (idx_test), la función de punto de entrada de MATLAB (myIndx), y la función MEX generada (myIndex_mex). Si todas son idénticas, isequal devolverá logical 1 (verdadero), confirmando que el código generado es correcto.

Tabla Comparativa: kmeans vs. pdist2 para Clasificación

Para clarificar cuándo usar cada función, aquí hay una tabla comparativa:

Característicakmeans (Fase de Entrenamiento)pdist2 (Fase de Predicción/Asignación)
Propósito PrincipalDescubrir la estructura de clusters en un conjunto de datos, identificar centroides.Calcular distancias entre dos conjuntos de puntos, encontrar el más cercano.
Entradas TípicasDatos de entrenamiento (X), número de clusters (k).Centroides (C), nuevos datos (Xtest).
Salidas TípicasÍndices de cluster para los datos de entrenamiento, posiciones de los centroides.Índices del centroide más cercano para cada punto nuevo.
Uso de Distancia EuclidianaInternamente para iterar y actualizar centroides.Explícitamente mediante el argumento 'euclidean'.
Generación de CódigoMenos común para la fase de predicción debido al gran tamaño de los datos de entrenamiento.Ideal para generar código ligero y eficiente para la asignación de nuevos datos.
Eficiencia en PredicciónBaja si se reentrena con datos nuevos y viejos.Alta, ya que solo compara nuevos puntos con centroides preexistentes.

Preguntas Frecuentes (FAQ)

¿Cuál es la diferencia entre pdist y pdist2?
pdist calcula las distancias por pares entre los vectores de un solo conjunto de datos (todas las combinaciones dentro de X). pdist2 calcula las distancias por pares entre los vectores de dos conjuntos de datos diferentes (cada fila de X1 con cada fila de X2).
¿Por qué usar pdist2 en lugar de simplemente ejecutar kmeans de nuevo con los nuevos datos?
Re-ejecutar kmeans con todos los datos (entrenamiento + nuevos) implica recalcular los centroides y reasignar todos los puntos, lo cual es computacionalmente costoso si los datos de entrenamiento son grandes. pdist2 solo calcula la distancia de los nuevos puntos a los centroides ya definidos, siendo mucho más eficiente para la tarea de asignación.
¿Necesito MATLAB Coder para usar pdist2?
No, puedes usar pdist2 directamente en MATLAB sin MATLAB Coder. MATLAB Coder es necesario solo si quieres generar código C/C++ optimizado a partir de tu script de MATLAB para despliegue o rendimiento crítico.
¿Puedo usar otras métricas de distancia con pdist2?
Sí, pdist2 soporta varias métricas de distancia además de 'euclidean', como 'cityblock' (Manhattan), 'chebychev', 'mahalanobis', 'cosine', y muchas otras. Esto la convierte en una función muy versátil para diferentes tipos de análisis.
¿Cómo manejo datos de alta dimensión con la distancia euclidiana?
La distancia euclidiana funciona matemáticamente en cualquier número de dimensiones. Sin embargo, en dimensiones muy altas, puede sufrir del fenómeno conocido como "la maldición de la dimensionalidad", donde las distancias entre puntos tienden a volverse muy similares, perdiendo su capacidad discriminatoria. En tales casos, otras métricas o técnicas de reducción de dimensionalidad pueden ser más apropiadas.

Conclusión

La capacidad de calcular la distancia euclidiana de forma eficiente es fundamental en numerosos campos que dependen del análisis de datos. MATLAB, con sus funciones optimizadas como kmeans para el entrenamiento de modelos de clustering y especialmente pdist2 para la asignación rápida de nuevos datos, ofrece un entorno robusto para estas tareas. La posibilidad de generar código C/C++ a través de MATLAB Coder eleva aún más la utilidad de estas herramientas, permitiendo desplegar algoritmos complejos en entornos con restricciones de rendimiento y memoria. Dominar el uso de pdist2 no solo te permitirá clasificar datos con precisión, sino también optimizar tus flujos de trabajo de manera significativa, haciendo que tus aplicaciones sean más rápidas y eficientes.

Si quieres conocer otros artículos parecidos a Cálculo de Distancia Euclidiana en MATLAB puedes visitar la categoría Matemáticas.

Subir