2009-11-10 75 views
6

我在編程集體智慧中使用下面的代碼,這是一本計算兩位電影評論家之間的距離的函數。Euclidian距離Python的實現

該函數將字典中排名的差異相加,但n維中的歐式距離也包括該和的平方根。由於我們使用相同的函數來排列每個人,無論我們是否平方根都沒有關係,但我想知道是否有特定的原因呢?

 

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) 

回答

12

不使用平方根的原因是因爲它在計算上很昂貴;它與單調函數是單調的(即保持秩序),所以如果你感興趣的只是距離的順序,那麼平方根是不必要的(並且如前所述,在計算上非常昂貴)。

3

這是正確的。雖然平方根對於定量的正確結果是必要的,但如果你關心的是相對於其他人進行排序的距離,那麼取平方根是多餘的。

2

要計算笛卡爾距離,首先必須計算距離平方,然後取其平方根。但是計算平方根在計算上是昂貴的。如果你真的感興趣的是比較距離,它也可以用來比較距離平方 - 它的速度比多了

每兩個實數A和B,其中A和B> =零,這總是真的,A-方和B-平方中的A相同的關係,B:如果

  • 一B,然後A平方< B平方。
  • 如果A == B,則A平方== B平方。
  • 如果A> B,則A平方> B平方。

由於距離總是> = 0,這種關係意味着比較距離平方給出與比較距離相同的答案。