我是关于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'
我不知道如何改进它,希望有人能帮助我! 非常感谢!!
答案 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])