关于python,我无法理解书中提供的示例

时间:2012-12-10 07:51:42

标签: python-2.7

我是关于python的新学习者,当我尝试重复指南中提供的示例时,存在一些问题。这个例子是关于推荐算法的。该示例试图实现项目列表,该项目列表存储已评定特定项目的用户。 这是代码(python 2.7)

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:'train'的数据格式是字典,类似于{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'

我不知道如何改进它,希望有人能帮助我! 非常感谢!!

2 个答案:

答案 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}

答案 1 :(得分: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])