使用 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 个项目时会运行数小时。
我正在尝试计算我的 dict 中所有项目的相似性,它花费的时间比我想要的要长。我认为这是 MapReduce 的一个很好的候选者,但我在键/值对方面“思考”时遇到了麻烦。
或者,我的方法是否存在问题,不一定是 Map Reduce 的候选者?