2009-11-10 104 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,这种关系意味着比较距离平方给出与比较距离相同的答案。