欧几里德距离Python实现

时间:2009-11-10 17:29:30

标签: python euclidean-distance

我正在使用编程集体智慧的以下代码,这是计算两位电影评论家之间的eclidian距离的书中的函数。

此函数对字典中排名的差异求和,但n维中的欧几里德距离也包括该总和的平方根。

AFAIK,因为我们使用相同的功能对每个人进行排名,无论我们是否平均根本没有关系,但我想知道是否有特殊原因?


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) 

4 个答案:

答案 0 :(得分:12)

不使用平方根的原因是因为它的计算成本很高;它是单调的(即,它保留顺序)和方形函数,所以如果你感兴趣的只是距离的顺序,那么平方根是不必要的(并且,如上所述,计算上非常昂贵)。

答案 1 :(得分:3)

这是对的。虽然平方根对于定量正确的结果是必要的,但如果您关心的是相对于其他人的距离进行排序,那么取平方根是多余的。

答案 2 :(得分:2)

要计算笛卡尔距离,首先必须计算距离平方,然后取平方根。但计算平方根在计算上是昂贵的。如果您真正感兴趣的是比较距离,那么它可以比较距离平方 - 并且它的更多更快。

对于每两个实数A和B,其中A和B>> = 0,A平方和B平方与A和B具有相同的关系总是正确的:

  • 如果A< B,然后A平方< B-平方。
  • 如果A == B,那么A平方== B平方。
  • 如果A> B,然后A平方> B-平方。

由于距离总是> = 0,这种关系意味着比较距离平方会给出与比较距离相同的答案。

答案 3 :(得分:1)

仅仅为了比对,没有必要使用平方根,你将获得平方的欧氏距离......这也是一个距离(从数学上讲,见http://en.wikipedia.org/wiki/Metric_%28mathematics%29)。