使用Python,我正在計算項目之間的餘弦相似度。轉換python協作過濾代碼以使用Map Reduce
給出了表示購買(用戶,項目)的事件數據,我有我的用戶「購買」的所有項目的列表。
鑑於這種輸入數據
(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的候選人?
你能鏈接或解釋有關地圖一點點減少?另外,請不要使用'sub'作爲變量名稱。有'operator.sub()',如果你把它交叉過來,它會在以後咬你。 – 2010-05-21 11:19:23
這不是真正的變量名,我只是僞編碼。就Map Reduce而言,我試圖將我的程序步驟轉換爲地圖縮小友好模型。 可以在http://labs.google.com/papers/mapreduce-osdi04-slides/index.html – 2010-05-21 11:34:50