En este artículo vamos a ver cómo calcular la distancia de Minkowski en el lenguaje de programación R.
distancia Minkowski:
La distancia de Minkowski es una distancia medida entre dos puntos en un espacio N-dimensional. Es básicamente una generalización de la distancia euclidiana y la distancia de Manhattan. Es ampliamente utilizado en el campo del aprendizaje automático, especialmente en el concepto de encontrar la correlación o clasificación óptima de los datos. La distancia de Minkowski se usa en ciertos algoritmos también como K-Nearest Neighbors, Learning Vector Quantization (LVQ), Self-Organizing Map (SOM) y K-Means Clustering.
Consideremos un espacio bidimensional que tiene tres puntos P 1 (X 1 , Y 1 ), P 2 (X 2 , Y 2 ) y P 3 (X 3, Y 3 ), la distancia de Minkowski está dada por ( | X 1 – Y 1 | pags + |X 2 – Y 2 | pags + |X 2 – Y 2 | pags ) 1/p . En R, la distancia de Minkowski se calcula con respecto a los vectores.
Por ejemplo,
nos dan dos vectores, vect1 como (4, 2, 6, 8) y vect2 como (5, 1, 7, 9). Su distancia de Minkowski para p = 2 está dada por, ( |4 – 5| 2 + |2 – 1| 2 + |6 – 7| 2 + |8 – 9| 2 ) 1/2 que es igual a 2. Esto artículo se centra en cómo podemos calcular la distancia de Minkowski en R.
Método 1: usar una función personalizada
Podemos calcular la distancia de Minkowski entre un par de vectores aplicando la fórmula,
( Σ|vector1 i – vector2 i | p) 1/p
Aquí,
vector1 es el primer vector
vector2 es el segundo vector
p es un número entero
A continuación se muestra la implementación en R para calcular la distancia de Minkowski mediante el uso de una función personalizada.
R
# R program to illustrate how to # calculate Minkowski distance # using a custom function # Custom function to calculate Minkowski distance calculateMinkowskiDistance <- function(vect1, vect2, p) { # Initializing answer variable as 0 answer <- as.integer(0) # Iterating over the length of the vector # Using for-in loop for (index in 0 : length(vect1)) { # temp stores the absolute difference raised to power p temp = as.integer(abs(vect1[index] - vect2[index]) ^ p) # Updating answer variable answer = sum(temp, answer) } # The final answer would be answer raised to # power 1 / p answer = answer ^ (1 / p) # Return the answer return(answer) } # Initializing a vector vect1 <- c(1, 3, 5, 7) # Initializing another vector vect2 <- c(2, 4, 6, 8) # Set p equal to 4 p <- as.integer(1) # Call the function to calculate MinkowskiDistance distance = calculateMinkowskiDistance(vect1, vect2, p) # Print the calculated distance print(paste("The Minkowski distance between vect1\ and vect2 having the value of p =",p, "is", distance )) # Set p equal to 5 p <- as.integer(2) # Call the function to calculate MinkowskiDistance distance = calculateMinkowskiDistance(vect1, vect2, p) # Print the calculated distance print(paste("The Minkowski distance between vect1\ and vect2 having the value of p =",p, "is", distance )) # Set p equal to 5 p <- as.integer(3) # Call the function to calculate MinkowskiDistance distance = calculateMinkowskiDistance(vect1, vect2, p) # Print the calculated distance print(paste("The Minkowski distance between vect1\ and vect2 having the value of p =",p, "is", distance )) # Set p equal to 5 p <- as.integer(4) # Call the function to calculate MinkowskiDistance distance = calculateMinkowskiDistance(vect1, vect2, p) # Print the calculated distance print(paste("The Minkowski distance between vect1 \ and vect2 having the value of p =",p, "is", distance ))
Producción:
Método 2: Usar la función dist() incorporada
R proporciona una función de dist incorporada con la que podemos calcular seis tipos de distancias, incluida la distancia de Minkowski. Esta función acepta un vector bidimensional o una array como parámetro. Esta función es bastante útil ya que calcula la distancia de Minkowski entre cada par único de vectores especificados en un vector bidimensional.
Sintaxis: dist(vect, método = “minkowski”, p = entero, diag = VERDADERO o FALSO, superior = VERDADERO o FALSO)
Parámetros:
- vect: Un vector bidimensional
- método: Debe ser igual a “minkowski”
- p: Debe ser igual a un entero
- diag: valor lógico (VERDADERO o FALSO) que transmite si la diagonal de la array de distancia debe ser impresa por print.dist o no.
- superior: valor lógico (VERDADERO o FALSO) que transmite si el triángulo superior de la array de distancia debe ser impreso por print.dist o no.
Tipo de devolución:
Devuelve un objeto de clase «dist» que representa la distancia de Minkowski entre cada par único de filas o vectores.
Nota: los parámetros diag y superior son opcionales
Ejemplo 1: Implementación utilizando vectores de igual longitud.
R
# R program to illustrate how to calculate # Minkowski distance By using inbuilt dist() # function # Initializing a vector vect1 <- c(1, 4, 8, 9, 2, 3) # Initializing another vector vect2 <- c(9, 4, 1, 2, 4, 7) # Initializing another vector vect3 <- c(1, 7, 9, 3, 2, 8) # Initializing another vector vect4 <- c(2, 1, 4, 7, 8, 9) # Initializing another vector vect5 <- c(1, 4, 8, 3, 9, 2) # Initializing another vector vect6 <- c(3, 7, 8, 6, 5, 9) #Row bind vectors into a single matrix twoDimensionalVect <- rbind(vect1, vect2, vect3, vect4, vect5, vect6) print("Minkowski distance between each pair of vectors is: ") cat("\n\n") # Calculate Minkowski distance between vectors # using built in dist method # By passing two-dimensional vector as a parameter # Since we want to calculate Minkowski distance # between each unique pair of vectors # That is why we are passing Minkowski as a method dist(twoDimensionalVect, method = "minkowski", diag = TRUE, upper = TRUE p = 2)
Producción:
Tenga en cuenta que la longitud de todos los vectores presentes en un vector bidimensional debe ser la misma. De lo contrario, el compilador generará un mensaje de advertencia.
Ejemplo 2: Implementación utilizando vectores de longitud desigual.
R
# R program to illustrate # how to calculate Minkowski distance # By using inbuilt dist() function # Initializing a vector # Note that the length of vec1 is one # more than the other vectors vect1 <- c(2, 4, 1, 9, 2, 3, 10) # Initializing another vector vect2 <- c(4, 8, 1, 2, 4, 7) # Initializing another vector vect3 <- c(11, 7, 9, 3, 2, 8) # Initializing another vector vect4 <- c(21, 1, 4, 7, 8, 9) # Initializing another vector vect5 <- c(11, 4, 8, 3, 9, 21) # Initializing another vector vect6 <- c(6, 7, 8, 6, 5, 9) #Row bind vectors into a single matrix twoDimensionalVect <- rbind(vect1, vect2, vect3, vect4, vect5, vect6) print("Minkowski distance between each pair of vectors is: ") cat("\n\n") # Calculate Minkowski distance between # vectors using built in dist method # By passing two-dimensional vector as a parameter # Since we want to calculate Minkowski # distance between each unique pair of vectors # That is why we are passing Minkowski as a method dist(twoDimensionalVect, method = "minkowski", diag = TRUE, upper = TRUE p = 2)
Producción:
Como puede ver en la salida, el compilador genera un mensaje de advertencia cuando los vectores tienen longitudes diferentes.