2014-09-19 69 views
0

我有一个关于相似性用户与皮尔森相关性的python代码,我想分析一下计算的步骤,因为我是一个Python hehe的初学者。当我尝试手动计算并与此程序的结果进行比较时,结果总是不一样。我想知道如果我在手动计算时错误了。该代码是这样的:皮尔逊在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)?我对感到困惑。我希望你能帮助我,谢谢你的提前。

回答

1

让我们你被迷惑线,并打破了下去:

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

从外到内让工作。最外层的部分是一个赋值语句,所以我们计算一些数值分配给sum1

sum1 = ... 

现在,让我们看到的是被赋予了什么:

sum1 = sum(...) 

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

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

外方括号告诉我们,我们得到一个列表。语法意味着这是一个列表理解。 Python运行一个for循环来产生列表项。我很确定变量名称it代表“item”。循环结束于字典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

+0

好的答案!非常详细的 – Llopis 2014-09-19 10:02:39

+0

和'n'指的是用户数量或用户评级的电影数量? – user3528526 2014-09-19 10:10:28

+0

我得到了'sum1 = 7'' sum2 = 8'' sum1sq = 21'' sum2sq = 22''psum = 56',这是真的吗?因为每次手动计算hmm时结果总是不一样 – user3528526 2014-09-19 10:18:52