sábado, 9 de mayo de 2020

Ejemplo cálculo de distancias, euclideana, de manhattan y de chebyshev

En este ejemplo se presenta la resolución de algunos ejercicios matemáticos para calcular la distancia entre dos puntos.

Distancia euclideana

La distancia euclideana entre dos puntos n dimensionales se define de la siguiente manera:

Para la resolución de estor problemas vamos a requerir la librería math de pyrhon la cual vamos a importar:

import math

Ahora para resolver el problema de la distancia euclideana definimos la siguiente función:

def euclidean(x,y):
   total = 0
   for i in range(len(x)):
     diff = x[i] - y[i]
     total = total + math.pow(diff, 2)
   return math.sqrt(total)

Distancia de manhattan

La distancia de manhattan entre dos puntos n dimensionales se define de la siguiente manera:

La función a continuación corresponde al algoritmo que calcula la distancia de manhattan

def manhattan(x,y):
   total = 0
   for i in range(len(x)):
     diff = x[i] - y[i]
     total = total + abs(diff)
   return total

Distancia de chebyshev

La distancia de chebyshev entre dos puntos n dimensionales se define de la siguiente manera:

La función a continuación corresponde al algoritmo que calcula la distancia de chebyshev:

def chebyshev(x, y):
   diffs = []
   for i in range(len(x)):
     diffs.append(abs(x[i] - y[i]))
   return max(diffs)

PONIENDOLO TODO JUNTO...

Ahora vamos a crear una función que nos permita validar que los dos vectores tienen la misma dimensión, es decir el mismo número de elementos. Esta recibirá los dos arreglos y validará la cantidad de elementos así:

def validateParams(x,y):
   if len(x) != len(y):
     return False
   return True

Para dinamizar la elección de el método a utilizar crearemos una función que reciba tres parámetros, el vector x, el vector y, y un string indicando la función a utilizar para calcular la distancia. Además, en caso de que no se especifique el nombre del método a utilizar se tomará por defecto el método euclideano.

Hay que tomar en cuenta que el nombre puede ser escrito incorrectamente, por eso haremos uso de la funcionalidad raise de Python para lanzar una excepción indicando que elk nombre ha sido mal escrito.

La función quedaría de la siguiente manera:

def distance(x, y, method='euclidean'):
   if not validateParams(x,y):
     return 0
   if method == 'euclidean':
     return euclidean(x, y)
   elif method == 'manhattan':
     return manhattan(x, y)
   elif method == 'chebyshev':
     return chebyshev(x, y)
   else:
     raise Exception("Debe seleccionar uno de los métodos [euclidean, manhattan, chebyshev]")

Ahora es tiempo de probar nuestros algoritmos, para lo cual definiremos dos vectores de la siguiente manera:

x = [9,3,5,3,-8]
y = [4,21,-5,7,11]

Ahora llamaremos a nuestra función de entrada distance con cada uno de los métodos e imprimiremos los resultados por consola:

print( f"Distancia euclideana: {distance(x,y,'euclidean')}")
print( f"Distancia de manhattan: {distance(x,y,'manhattan')}")
print( f"Distancia de chebyshev: {distance(x,y,'chebyshev')}")

El resultado de la ejecución se muestra en la siguiente imagen:

No hay comentarios.:

Publicar un comentario