2009-11-10 9 views
6

Używam następującego kodu z programowania inteligencji zbiorowej, jest to funkcja z książki, która oblicza odległość eclidian między dwoma krytykami filmowymi.Euclidian Distance Python Implementation

Ta funkcja sumuje różnicę w rankingu w słowniku, ale odległość euklidesowa w n wymiarach obejmuje także pierwiastek kwadratowy z tej sumy.

AFAIK, ponieważ używamy tej samej funkcji do oceniania wszystkich, nie ma znaczenia, że ​​mamy pierwiastek kwadratowy lub nie, ale zastanawiałem się, czy istnieje jakiś szczególny powód?

 

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) 

Odpowiedz

12

Powód, dla którego pierwiastek kwadratowy nie jest używany, jest kosztowny obliczeniowo; jest monotoniczna (tzn. zachowuje porządek) z kwadratową funkcją, więc jeśli wszystko, co cię interesuje, to kolejność odległości, pierwiastek kwadratowy jest niepotrzebny (i, jak wspomniano, bardzo kosztowny obliczeniowo).

3

Zgadza się. O ile pierwiastek kwadratowy jest konieczny dla uzyskania poprawnego wyniku ilościowego, o ile wszystko, na czym zależy, to dystans względem innych do sortowania, to zbieranie pierwiastka kwadratowego jest zbędne.

2

Aby obliczyć odległość kartezjańską, najpierw należy obliczyć odległość-do kwadratu, a następnie wziąć pierwiastek kwadratowy. Ale obliczanie pierwiastka kwadratowego jest kosztowne obliczeniowo. Jeśli naprawdę interesujesz się odległościami, to równie dobrze możesz porównać odległość-kwadrat - i to znacznie szybciej.

Dla każdych dwóch liczb rzeczywistych A i B, gdzie A i B są> = zero, to zawsze prawda, że ​​A-squared i B-squared mają ten sam związek jako A i B:

  • jeśli < B, następnie A-kwadrat < B-kwadrat.
  • jeśli A == B, to A-kwadrat == B-kwadrat.
  • jeśli A> B, to A-kwadrat> B-kwadrat.

Ponieważ odległości są zawsze> = 0, relacja ta oznacza, że ​​porównanie odległości-kwadratu daje taką samą odpowiedź jak porównywanie odległości.