- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 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/
我想插入 备注 关于要在我的 latex 文档的特定位置进行的修复 也许有一个 列表的“待办事项/修复我” 你怎么处理这个? 似乎一种方法是使用 fixme 包,但我无法使其工作。 有人在用吗? 最佳
错误:无法创建表。我已经创建了一个数据库,并且已经提供了所有特权。但仍然无法登录协作模块。我受够了,但我不想放弃。我已经尝试了所有可能的方法,但都行不通。 Stackoverflow 是我所知道的最好
我是一名优秀的程序员,十分优秀!