2009-11-10 14 views
6

Estoy jugando con el siguiente código de programación de inteligencia colectiva, esta es una función del libro que calcula la distancia eclidiana entre dos críticos de película.Euclidian Distance Python Implementation

Esta función suma la diferencia de las clasificaciones en el diccionario, pero la distancia euclidiana en n dimensiones también incluye la raíz cuadrada de esa suma.

AFAIK ya que usamos la misma función para clasificar a todos, no importa que tengamos la raíz cuadrada o no, pero me preguntaba ¿hay alguna razón en particular para eso?

 

from math import sqrt 
# Returns a distance-based similarity score for person1 and person2 
def sim_distance(prefs,person1,person2): 
    # Get the list of shared_items 
    si={} 
    for item in prefs[person1]: 
    if item in prefs[person2]: 
     si[item]=1 
    # if they have no ratings in common, return 0 
    if len(si)==0: return 0 
    # Add up the squares of all the differences 
    sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 
         for item in prefs[person1] if item in prefs[person2]]) 
    return 1/(1+sum_of_squares) 

Respuesta

12

La razón por la que no se usa la raíz cuadrada es porque es computacionalmente costosa; es monótona (es decir, conserva el orden) con la función cuadrada, por lo que si todo lo que le interesa es el orden de las distancias, la raíz cuadrada es innecesaria (y, como se mencionó, muy costosa desde el punto de vista computacional).

3

Eso es correcto. Si bien la raíz cuadrada es necesaria para un resultado cuantitativamente correcto, si lo único que te interesa es la distancia relativa a los demás para la clasificación, entonces tomar la raíz cuadrada es superfluo.

2

Para calcular una distancia cartesiana, primero debe calcular la distancia al cuadrado, luego toma su raíz cuadrada. Pero calcular una raíz cuadrada es computacionalmente costoso. Si todo lo que realmente le interesa es comparar distancias, funciona igual de bien comparar la distancia cuadrada, y es mucho más rápido.

Por cada dos números reales A y B, donde A y B son> = cero, siempre es cierto que un cuadrado y B-squared tienen la misma relación que A y B:

  • si A < B, luego A-squared < B-squared.
  • si A == B, luego A-squared == B-squared.
  • si A> B, luego A-cuadrado> B-cuadrado.

Dado que las distancias siempre son> = 0, esta relación significa que la comparación de distancia-cuadrado brinda la misma respuesta que comparar la distancia.

Cuestiones relacionadas