0

我有一个关于 Pearson's Correlation 相似性用户的 python 代码,我想分析计算步骤,因为我是 Python 的初学者,呵呵。当我尝试手动计算并与该程序的结果进行比较时,结果总是不同。我想知道我在尝试手动计算时是否弄错了。代码是这样的:

# A dictionary of movie critics and their ratings of a small set of movies


critics={'User 1': {'Spiderman': 1.0, 'Batman Begins': 2.0, 'Superman': 4.0},
  'User 2': {'Spiderman': 2.0, 'Batman Begins': 3.0, 'Superman': 3.0}
}


from math import sqrt

# Returns the Pearson correlation coefficient for p1 and p2
def sim_pearson(prefs,p1,p2):
  # Get the list of mutually rated items
  si={}
  for item in prefs[p1]:
    if item in prefs[p2]: si[item]=1

  # if they are no ratings in common, return 0
  if len(si)==0: return 0

  # Sum calculations
  n=len(si)

  # Sums of all the preferences
  sum1=sum([prefs[p1][it] for it in si])
  sum2=sum([prefs[p2][it] for it in si])

  # Sums of the squares
  sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
  sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

  # Sum of the products
  pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

  # Calculate r (Pearson score)
  num=pSum-(sum1*sum2/n)
  den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
  if den==0: return 0

  r=num/den

  return r


def main():
    z = sim_pearson(critics, 'User 1','User 2')
    print z

if __name__ == "__main__":
    main()

我想计算用户 1 和用户 2 之间的相似度。但这部分我很困惑:

([prefs[p1][it] for it in si])

[它]是什么意思?

如果我使用这个程序,相似的结果是:0.755928946018

是真的这段代码的意思([prefs[p1][it] for it in si])是乘以用户 1 的评级吗?喜欢1*2*4?还是必须与用户 2 的评分相乘?喜欢(1*2)+(1*3)+(4*3)

我对[p1][it]. 我希望你能帮助我,谢谢你的提前。

4

1 回答 1

1

让我们把你困惑的那条线分解一下:

sum1=sum([prefs[p1][it] for it in si])

让我们从外到内工作。最外面的部分是一个赋值语句,所以我们正在计算一些值来赋值sum1

sum1 = ...

现在,让我们看看分配了什么:

sum1 = sum(...)

内置sum函数期望传递一个可迭代对象(例如列表)。让我们看看论据是什么:

sum1 = sum([... for it in si])

外面的方括号告诉我们我们得到了一个列表。for it in si语法意味着这是一个列表推导。Python 运行一个for循环来生成列表中的项目。我很确定变量名it代表“项目”。循环在字典的键上si(实际上应该创建为列表,因为您从不关心它的值)。

值得注意的是,您实际上可以从这里的代码中省略方括号,而不是作为一个列表推导式来生成一个完整的列表,它会是一个“惰性”生成器表达式,它创建一个可迭代的生成器对象来计算根据要求,将每个值一一对应。

无论如何,让我们找出列表理解的项目是什么:

sum1 = sum([...[it] for it in si])

中的方括号[it]是索引语法,因为它们紧挨着另一个表达式的右侧。您可以使用整数索引列表和元组,以及使用任何类型的可散列对象(例如字符串)索引字典。在这种情况下,它们的键是it,这是我们在列表推导中的循环变量。让我们看看我们在索引什么:

sum1 = sum([...[p1][it] for it in si])

[it]索引被应用于先前索引的结果,这一次使用,[p1]它是函数的参数。让我们看看这个索引是做什么的:

sum1 = sum([prefs[p1][it] for it in si])

正在对 进行索引prefs,这是一个保存字典的全局变量。该字典的键是评论者(这是p1必须的),值是从电影名称映射到评级的进一步嵌套字典。

因此,该语句将一个评论者对一组特定电影的评分相加,并将它们分配给sum1. 使用您的示例数据,这将是1.0 + 2.0 + 4.0,因此sum1将被分配7.0

于 2014-09-19T09:56:53.660 回答