gpt4 book ai didi

python - 将python协同过滤代码转换为使用Map Reduce

转载 作者:可可西里 更新时间:2023-11-01 14:21:38 26 4
gpt4 key购买 nike

我使用 Python 计算项目之间的余弦相似度。

给定表示购买(用户、项目)的事件数据,我有一个由我的用户“购买”的所有项目的列表。

给定这个输入数据

(user,item)
X,1
X,2
Y,1
Y,2
Z,2
Z,3

我建立了一个 python 字典

{1: ['X','Y'], 2 : ['X','Y','Z'], 3 : ['Z']}

从那个字典中,我生成了一个购买/未购买矩阵,也是另一个字典 (bnb)。

{1 : [1,1,0], 2 : [1,1,1], 3 : [0,0,1]} 

从那里开始,我通过计算 (1,1,0) 和 (1,1,1) 之间的余弦来计算 (1,2) 之间的相似度,得到 0.816496

我这样做是为了:

items=[1,2,3]
for item in items:
for sub in items:
if sub >= item: #as to not calculate similarity on the inverse
sim = coSim( bnb[item], bnb[sub] )

我认为蛮力方法正在杀死我,而且它只会随着数据变大而运行得更慢。在处理 8500 个用户和 3500 个项目时,使用我可信赖的笔记本电脑,此计算会运行数小时。

我正在尝试为我的字典中的所有项目计算相似度,但它花费的时间比我希望的要长。我认为这是 MapReduce 的一个很好的候选者,但我在“思考”键/值对方面遇到了麻烦。

或者,我的方法有问题,不一定适合 Map Reduce 吗?

最佳答案

这实际上不是一个“MapReduce”函数,但它应该给你一些显着的加速,而没有所有的麻烦。

我实际上会使用 numpy 来“向量化”操作,让您的生活更轻松。由此,您只需遍历该字典并应用矢量化函数将此项与所有其他项进行比较。

import numpy as np
bnb_items = bnb.values()
for num in xrange(len(bnb_items)-1):
sims = cosSim(bnb_items[num], bnb_items[num+1:]

def cosSim(User, OUsers):
""" Determinnes the cosine-similarity between 1 user and all others.
Returns an array the size of OUsers with the similarity measures

User is a single array of the items purchased by a user.
OUsers is a LIST of arrays purchased by other users.

"""

multidot = np.vectorize(np.vdot)
multidenom = np.vectorize(lambda x: np.sum(x)*np.sum(User))

#apply the dot-product between this user and all others
num = multidot(OUsers, User)

#apply the magnitude multiplication across this user and all others
denom = multidenom(OUsers)

return num/denom

我没有测试过这段代码,所以可能会有一些愚蠢的错误,但这个想法应该能让你完成 90%。

这应该有显着的加速。如果您仍然需要加速,可以阅读一篇精彩的博客文章,其中实现了“Slope One”推荐系统 here .

希望对你有帮助,将

关于python - 将python协同过滤代码转换为使用Map Reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com