協(xié)同過濾算法MapReduce實現(xiàn)(python)

python實現(xiàn)協(xié)同過濾算法

實現(xiàn)基于MapReduce協(xié)同過濾谭网,需要三個階段快集,如下所示

第一個MapReduce:通過ui矩陣得到歸一化后的ui矩陣

map階段:以i為key進行分區(qū)排序纪岁,相同的key的hash編碼放到同一個partition中,

#!/usr/local/bin/python
import sys
for line in sys.stdin:
  u, i, s = line.strip().split(',')
  print "%s\t%s\t%s" % (i, u, s)

reduce階段:利用同一個i被所用用戶打過分的score,對其進行歸一化操作

#!/usr/local/bin/python
import sys
import math

cur_item = None
user_score_list = []

for line in sys.stdin:
    item, user, score = line.strip().split('\t')
    if cur_item == None:
        cur_item = item
    if item != cur_item:
        sum = 0.0
        for tuple in user_score_list:
            (u, s) = tuple
            sum  += pow(s,2)
        sum = math.sqrt(sum)
        for tuple in user_score_list:
            (u, s) = tuple 
            print "%s\t%s\t%\t" % (u,cur_item,float(s/sum))
        user_score_list = []
        cur_item = item
    user_score_list.append((user,float(score))

for tuple in user_score_list:
    (u, s) = tuple
    sum += pow(s, 2)
sum = math.sqrt(sum)
for tuple in user_score_list:
    (u, s) = tuple
    print "%s\t%s\t%s" % (u, cur_item, float(s / sum))
第二個MapReduce:

map階段:為了得到ii 矩陣必須以u為key杠步,得到(u,i,s)

#!/usr/local/bin/python
import sys

for line in sys.stdin:
    u, i, s = line.strip().split('\t')
    print "%s\t%s\t%s" % (u, i, s)

reduce階段:對同一個用戶孩锡,計算所有打過分的item之間歸一化后的分數(shù)的乘積鸟顺,得到 ii 矩陣

#!/usr/local/bin/python

import sys
cur_user = None
item_score_list = []
for  line in sys.stdin:
    user, item, score = line.strip().split(\t')
    if cur_user == None:
        cur_user = user
    if cur_user != user:
        for i in range(0,len(item_score_list) -1):
            for j in range(i +1,len(item_score_list)):
                item_a, score_a = item_score_list[i]
                item_b, score_b = item_score_list[j]
                print "%s\t%s\t%s" % (item_a, item_b, score_a * score_b)
                print "%s\t%s\t%s" % (item_b, item_a, score_a * score_b)
        item_score_list = []
        cur_user = user
    item_user_score.append((item, float(score)))

for i in range(0, len(item_score_list) - 1):
    for j in range(i + 1, len(item_score_list)):
        item_a, score_a = item_score_list[i]
        item_b, score_b = item_score_list[j]
        print "%s\t%s\t%s" % (item_a, item_b, score_a * score_b)
        print "%s\t%s\t%s" % (item_b, item_a, score_a * score_b)
第三個MapReduce:

map階段:以item_a_item_b key惦蚊,調(diào)用map函數(shù)

#!/usr/local/bin/python
import sys

for line in sys.stdin:
    item_a, item_b, s = line.strip().split('\t')
    print "%s\t%s" % (item_a +"_" + item_b, s)

reduce階段: 對相同的key進行聚合,對value值score進行求和,就得到item與item之間的相似度

#!/usr/local/bin/python
import  sys

cur_ii_pair = None
score = 0.0
for line in sys.stdin:
    ii_pair, s = line.strip().split('\t')
    if cur_ii_pair == None:
        cur_ii_pair = ii_pair
    if cur_ii_pair != ii_pair:
        item_a, item_b = cur_ii_pair.split('_')
        print "%s\t%s\t%s" % (item_a, item_b, sum)
        cur_ii_pair = ii_pair
        score = 0.0
    score += float(s)
item_a, item_b = cur_ii_pair.split('_')
    print "%s\t%s\t%s" % (item_a, item_b, sum)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讯嫂,一起剝皮案震驚了整個濱河市蹦锋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欧芽,老刑警劉巖莉掂,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異千扔,居然都是意外死亡憎妙,警方通過查閱死者的電腦和手機库正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厘唾,“玉大人褥符,你說我怎么就攤上這事「Ю” “怎么了喷楣?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹤树。 經(jīng)常有香客問我铣焊,道長,這世上最難降的妖魔是什么罕伯? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任粗截,我火速辦了婚禮,結(jié)果婚禮上捣炬,老公的妹妹穿的比我還像新娘。我一直安慰自己绽榛,他們只是感情好湿酸,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灭美,像睡著了一般推溃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上届腐,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天铁坎,我揣著相機與錄音,去河邊找鬼犁苏。 笑死硬萍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的围详。 我是一名探鬼主播朴乖,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼助赞!你這毒婦竟也來了买羞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤雹食,失蹤者是張志新(化名)和其女友劉穎畜普,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體群叶,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吃挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年钝荡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒鹿。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡化撕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出约炎,到底是詐尸還是另有隱情植阴,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布圾浅,位于F島的核電站掠手,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狸捕。R本人自食惡果不足惜喷鸽,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灸拍。 院中可真熱鬧做祝,春花似錦、人聲如沸鸡岗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轩性。三九已至声登,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揣苏,已是汗流浹背悯嗓。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卸察,地道東北人脯厨。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像坑质,于是被迫代替她去往敵國和親俄认。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容