【发布时间】:2010-07-05 07:39:41
【问题描述】:
给定购买事件列表(customer_id,item)
1-hammer
1-screwdriver
1-nails
2-hammer
2-nails
3-screws
3-screwdriver
4-nails
4-screws
我正在尝试构建一个数据结构,该结构可以告诉您一件商品与另一件商品一起购买了多少次。不是同时买的,是我开始存数据的时候买的。结果看起来像
{
hammer : {screwdriver : 1, nails : 2},
screwdriver : {hammer : 1, screws : 1, nails : 1},
screws : {screwdriver : 1, nails : 1},
nails : {hammer : 1, screws : 1, screwdriver : 1}
}
表示用钉子买了两次锤子(人 1,3),用螺丝刀买了一次(人 1),用螺丝刀买了一次螺丝(人 3),依此类推......
我目前的做法是
users = dict 其中 userid 是键,购买的物品列表是值
usersForItem = dict 其中 itemid 是键,购买商品的用户列表是值
userlist = 对当前项目评分的用户的临时列表
pseudo:
for each event(customer,item)(sorted by item):
add user to users dict if not exists, and add the items
add item to items dict if not exists, and add the user
----------
for item,user in rows:
# add the user to the users dict if they don't already exist.
users[user]=users.get(user,[])
# append the current item_id to the list of items rated by the current user
users[user].append(item)
if item != last_item:
# we just started a new item which means we just finished processing an item
# write the userlist for the last item to the usersForItem dictionary.
if last_item != None:
usersForItem[last_item]=userlist
userlist=[user]
last_item = item
items.append(item)
else:
userlist.append(user)
usersForItem[last_item]=userlist
所以,在这一点上,我有 2 个字典 - 谁买了什么,谁买了什么。这就是棘手的地方。现在 usersForItem 已填充,我循环遍历它,循环遍历每个购买该项目的用户,并查看用户的其他购买。我承认这不是最 Pythonic 的做事方式 - 我试图确保在使用 Python 之前得到正确的结果(我就是这样)。
relatedItems = {}
for key,listOfUsers in usersForItem.iteritems():
relatedItems[key]={}
related=[]
for ux in listOfReaders:
for itemRead in users[ux]:
if itemRead != key:
if itemRead not in related:
related.append(itemRead)
relatedItems[key][itemRead]= relatedItems[key].get(itemRead,0) + 1
calc jaccard/tanimoto similarity between relatedItems[key] and its values
有没有更有效的方法可以做到这一点?另外,如果这种手术有合适的学术名称,我很想听听。
编辑:澄清包括我不限制购买同时购买的物品这一事实。物品可以随时购买。
【问题讨论】:
-
你的数据集有多大?亚马逊在 hadoop 上使用了一些算法来查看它曾经销售过的每件商品并生成建议的商品......另外,请参阅stackoverflow.com/questions/1849693/…
-
假设有 200 万个事件,大约有 5000 个用户和 10000 个项目。 K-最近邻不会涉及将每个项目与其他项目进行比较,即使是没有重叠的项目?
-
如果您只关心商品一起购买了多少次,为什么还要担心用户?您可以简单地按购买事件进行分组,这样您就可以将产品字典与与他们一起购买的其他产品相关联。事实上,您可以将每个产品与其他产品的最大堆关联,其值是它们一起出现的次数,这样您就可以有效地获得任何给定项目的最常购买的项目. (堆位可能会走得太远)。如果这对您来说是一个可行的想法,我可以写一个更完整的答案。
-
Anthony 这正是我正在寻找的反馈。请详细说明。我不太关心用户 ID,以至于我想计算同一用户购买商品 a 和 b 的次数。
-
您是否在查找同一用户的购买次数?或者它们在同一个用户中存在的次数? IE。重要的是我同时买了锤子和钉子,还是我买了锤子,然后在其他时间回来买钉子。
标签: python algorithm optimization similarity