¿Cómo calcular la distancia de Minkowski en R?

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.

Publicación traducida automáticamente

Artículo escrito por bhuwanesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *