2012-12-10 64 views
2

我是一名關於python的新學習者,並且在嘗試重複指導手冊中提供的示例時遇到了一些問題。這個例子是關於推薦算法的。這個例子試圖實現一個項目列表,存儲評估特定項目的用戶。 這是代碼(蟒2.7)關於python,我無法理解書中提供的示例

def UserSimilarity(train): 
    #build inverse table for item_users 
    item_users=dict() 
    for u,items in train.items(): 
     for i in items.keys(): 
      if i not in item_users: 
       item_users[i]=set()    
      item_users[i].add(u) 


    #calculate co-rated items between users 
    C=dict() 
    N=dict() 
    for i, users in item_users.items(): 
     print i,users 
     #print N[u] 
     for u in users: 
      N[u]=N[u]+1 
      print N[u] 
      for v in users: 
       print C[u][v] 
       if u==v: 
        continue 
       C[u][v]=C[u][v]+1 

    #calculate finial similarity matrix W 
    W=dict() 
    for u, related_users in C.items(): 
     for v, cuv in related_users.items(): 
      W[u][v]=cuv/math.sqrt(N[u]*N[v]) 
    return W 

PS: '訓練' 的數據格式是字典和類似{UserId1:{ItemId1:Ratings1,ItemId2,Rating2,...},...}

我所遇到的問題是,

Traceback (most recent call last): 
    File "D:\Users\Administrator\workspace\GroupLens\src\test3.py", line 82, in <module> 
    UserSimilarity(train_dic) 
    File "D:\Users\Administrator\workspace\GroupLens\src\test3.py", line 66, in UserSimilarity 
    N[u]=N[u]+1 
KeyError: '3' 

我不不知道如何改善它,並希望有人能幫助我! 非常感謝!

+1

該錯誤指示的u個電流值不存在作爲KEYIN字典N,所以不能獲取它,並添加一個至它。爲什麼不存在?不可能說沒有看到其餘的代碼。 –

+0

耶〜你是對的!這就是我錯了的地方。謝謝你的回答,這對我很有幫助! –

回答

0

主要問題是您正在定義一個新字典(N = dict()),然後遍歷您的users,試圖根據給定的用戶創建字典密鑰。這部分是好的,但是當你這樣做的問題出現了:

N[u]=N[u]+1 

到字典中是好的,但看在右側指定的值 - 你想分配給N[u]N[u] + 1值,當N[u]尚不存在(因此錯誤)。我並不是100%確定總體目標是什麼(所以這可能被誤導),但是如果您的目標是根據用戶發生的次數增加一個數字,您可以使用defaultdict,該類型是使用類型創建的作爲一個參數(這裏是一個int)。這意味着,如果該鍵沒有被發現(如您的錯誤上面),默認值是根據你聲明的類型(這裏0):

In [1]: from collections import defaultdict 

In [2]: N = defaultdict(int) 

In [3]: users = [1, 2, 3, 2, 1, 2] 

In [4]: for u in users: 
    ...:  N[u] += 1 
    ...:  
    ...:  

In [5]: N 
Out[5]: defaultdict(<type 'int'>, {1: 2, 2: 3, 3: 1}) 

或者,你可以使用普通的字典,而是與get方法,它返回如果找到了值,但返回默認如果不是(也可以指定自己默認):

In [1]: N = dict() 

In [2]: users = [1, 2, 3, 2, 1, 2] 

In [3]: for u in users: 
    ...:  N[u] = N.get(u, 0) + 1 
    ...:  
    ...:  

In [4]: N 
Out[4]: {1: 2, 2: 3, 3: 1} 
+0

非常感謝!是的,問題是我沒有給N(u)賦一個初始值。你的回答很有幫助,我從中學到了很多東西!再次感謝您的及時幫助! –

+0

@littlejessie完全沒問題,很高興幫助。祝你一切順利! – RocketDonkey

0

太謝謝你了!是的,問題是我沒有給N(u)賦一個初始值。你的回答很有幫助,我從中學到了很多東西!再次感謝您的及時幫助!以下是改性的和成功版〜

改性版

def UserSimilarity(train): 
    #build inverse table for item_users 
    item_users=dict() 
    for u,items in train.items(): 
     for i in items.keys(): 
      if i not in item_users: 
       item_users[i]=set()    
      item_users[i].add(u) 

    #calculate co-rated items between users 
    C=dict() 
    N=dict() 
    for i, users in item_users.items(): 
     for u in users: 
      if u in N.keys(): 
       N[u] +=1 
      else: 
       N[u]=0     

      for v in users: 
       if u==v: 
        continue 
       elif u in C.keys(): 
        if v in C[u].keys(): 
         C[u][v] +=1 
        else: 
         C[u][v] =1 
       else: 
        C[u]=dict({v:1}) 

    #calculate final similarity matrix W 
    W=dict() 
    for u, related_users in C.items(): 
     W[u]=dict() 
     for v, cuv in related_users.items(): 
      W[u][v] = cuv/math.sqrt(N[u]*N[v])