2014-09-19 32 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

相關問題