物品間具有先后關(guān)系的ItemCF算法實(shí)現(xiàn)

簡(jiǎn)書(shū)不支持Markdown Math語(yǔ)法,請(qǐng)移步https://glassywing.github.io/2018/06/28/spark_linear_itemcf/

傳統(tǒng)的ItemCF算法爱态,物品間不具有先后關(guān)系,可以任意進(jìn)行推薦鸳碧。這樣的算法并不適用某些場(chǎng)景(見(jiàn)下文背景),對(duì)于此類(lèi)場(chǎng)景,對(duì)ItemCF算法進(jìn)行了擴(kuò)展,使其可以依據(jù)當(dāng)前用戶(hù)使用的物品進(jìn)行推薦米碰。

注意:該算法只是在原有的ItemCF實(shí)現(xiàn)上進(jìn)行了擴(kuò)展,它只能根據(jù)當(dāng)前使用的物品推薦下一個(gè)物品躲履,并不記憶之前使用的物品(不依據(jù)上下文信息進(jìn)行推薦)。

語(yǔ)義

  • 構(gòu)件:SOA程序模型設(shè)計(jì)過(guò)程中以實(shí)現(xiàn)某種功能的程序片段或模塊
  • 流程:使用多個(gè)構(gòu)件進(jìn)行線(xiàn)性組合后的以實(shí)現(xiàn)某種特定功能的執(zhí)行過(guò)程聊闯,即SOA工作流

背景

SOA工作流中具有很多的構(gòu)件工猜,這些構(gòu)件能以線(xiàn)性方式組合成一條流程(流程按照線(xiàn)性關(guān)系被依次執(zhí)行)。在使用一個(gè)構(gòu)件之后菱蔬,可隨之使用另一個(gè)后續(xù)的構(gòu)件篷帅,前一個(gè)構(gòu)件和后一個(gè)構(gòu)件間具有嚴(yán)明的先后關(guān)系史侣,即后一個(gè)構(gòu)件不能反向使用前一個(gè)構(gòu)件,前一個(gè)構(gòu)件可以使用不同的后續(xù)構(gòu)件魏身。

由于前一個(gè)構(gòu)件使用后可以使用不同的后續(xù)構(gòu)件惊橱,對(duì)于新用戶(hù)來(lái)說(shuō),必須翻閱文檔才知道可用的下一個(gè)構(gòu)件箭昵,最終才能進(jìn)行選擇。使操作變得相當(dāng)繁瑣正林,造成大量的時(shí)間浪費(fèi)涵但,因此需要一種能通過(guò)以往用戶(hù)記錄為用戶(hù)推薦下一個(gè)可用構(gòu)件的方式來(lái)減輕工作負(fù)擔(dān)瞳脓。

目標(biāo)

要求用戶(hù)在工作流中連接一個(gè)構(gòu)件后埋涧,推薦出下一個(gè)可用的構(gòu)件棘催,下一個(gè)構(gòu)件按照預(yù)測(cè)的用戶(hù)評(píng)分從高到低進(jìn)行排列,并可指定推薦的構(gòu)件數(shù)量。

數(shù)據(jù)存儲(chǔ)格式

用戶(hù)歷史行為日志

用戶(hù)歷史記錄以表:history表示,其中userId表示用戶(hù)ID诱篷,compId表示構(gòu)件ID,folloCompId表示使用了compId后使用的構(gòu)件ID,count表示用戶(hù)使用了comp之后又繼續(xù)使用folloComp的使用次數(shù)。

userId compId followCompId count timestamp
1 1 2 1
1 1 3 2
2 1 2 1
2 1 4 3

算法說(shuō)明

相似度度量算法

這里我們選擇使用同現(xiàn)相似度作為相似度度量標(biāo)準(zhǔn):

同現(xiàn)相似度公式

$$ w(x,y)=\frac{|N(x)\cap{N(y)}|}{|N(x)|} $$

公式中分母是喜歡物品x的用戶(hù)數(shù)瓤狐,而分子則是同時(shí)對(duì)物品x和物品y感興趣的用戶(hù)數(shù)。因此信姓,上述公式可用理解為對(duì)物品x感興趣的用戶(hù)有多大概率也對(duì)y感興趣 (和關(guān)聯(lián)規(guī)則類(lèi)似)

但上述的公式存在一個(gè)問(wèn)題,如果物品y是熱門(mén)物品,有很多人都喜歡,則會(huì)導(dǎo)致W(x, y)很大,接近于1。因此會(huì)造成任何物品都和熱門(mén)物品交有很大的相似度也切。為此我們用如下公式進(jìn)行修正:

改進(jìn)型同現(xiàn)相似度公式

$$ w(x,y)=\frac{|N(x)\cap{N(y)}|}{\sqrt{|N(x)||N(y)|}} $$

這個(gè)格式懲罰了物品y的權(quán)重,因此減輕了熱門(mén)物品和很多物品相似的可能性。(也歸一化了)

預(yù)測(cè)用戶(hù)評(píng)分公式

$$ pred_{u,p}=\frac{\sum_{i\in{ratedItems(u)}}{sim(i,p)r_{u,i}}}{\sum_{i\in{ratedItems(u)}}{sim(i,p)}} $$

公式中u指用戶(hù),p值物品,ratedItems(u)指用戶(hù)u評(píng)價(jià)過(guò)的物品,sim指相似度(item之間的),r指用戶(hù)對(duì)使用過(guò)的物品i的評(píng)分(這里指使用次數(shù))。

算法實(shí)現(xiàn)

計(jì)算過(guò)程

假設(shè)現(xiàn)在用戶(hù)1在流程中連接了一個(gè)構(gòu)件a旬牲,在用戶(hù)歷史記錄中晌区,構(gòu)件a之后可用的構(gòu)件有b和c契讲。根據(jù)同現(xiàn)相似度的定義,計(jì)算過(guò)程如下:

  1. 多少用戶(hù)使用了a之后使用過(guò)b:numAToB
  2. 多少用戶(hù)使用了a之后使用過(guò)c:numAToC
  3. 多少用戶(hù)使用了a之后既使用過(guò)b又使用過(guò)c: numAToBC
  4. 通過(guò)相似度計(jì)算公式計(jì)算b和c之間的相似度: simBC
  5. 按照用戶(hù)評(píng)分公式預(yù)測(cè)用戶(hù)1對(duì)b,c的評(píng)分
  6. 按照評(píng)分高低從高到低進(jìn)行排列

具體實(shí)現(xiàn)

物品相似度計(jì)算

  1. 統(tǒng)計(jì)在使用了第一個(gè)構(gòu)件后又使用第二個(gè)構(gòu)件的用戶(hù)數(shù)量:

    通過(guò)在用戶(hù)歷史原表上按(compId,followCompId)進(jìn)行聚合計(jì)數(shù)操作琉预,可以得到在使用了第一個(gè)構(gòu)件后又使用第二個(gè)構(gòu)件的用戶(hù)數(shù)量:

    表:numRaters

    compId followCompId numRaters
    1 2 2
    1 3 1
    1 4 1
  2. 將表numRaters和表history進(jìn)行內(nèi)聯(lián)操作啄栓,并忽略掉count

    表:historyWithSize

    userId compId followCompId numRaters
    1 1 2 2
    1 1 3 1
    2 1 2 2
    2 1 4 1
  3. 將表historyWithSize和表historyWithSize按照(userId, compId)進(jìn)行內(nèi)聯(lián)并按照f(shuō)ollowCompId1 < followCompId2進(jìn)行過(guò)濾:

    userId compId followCompId1 numRaters1 followCompId2 numRaters2
    1 1 2 2 3 1
    2 1 2 2 4 1
  4. 統(tǒng)計(jì)在使用過(guò)comp后既使用過(guò)followComp1又使用過(guò)followComp2的用戶(hù)數(shù),使用列size表示:

    compId followCompId1 numRaters1 followCompId2 numRaters2 size
    1 2 2 3 2 1
    1 2 2 4 1 1
  5. 計(jì)算followComp1followComp2的相似度:

    表:similarities

    compId followCompId1 followCompId2 cosSim
    1 2 3 0.5
    1 2 4 0.7

對(duì)用戶(hù)進(jìn)行推薦

  1. 要計(jì)算用戶(hù)對(duì)物品的興趣度螃宙,需要首先獲取用戶(hù)的歷史行為,由于用戶(hù)連接一個(gè)構(gòu)件后才進(jìn)行推薦伺糠,因此用戶(hù)歷史記錄以(userId, compId)進(jìn)行限制:

    userId compId followCompId count timestamp
    1 1 2 1
    1 1 3 2
    2 1 2 1
    2 1 4 3
  2. 將指定用戶(hù)的歷史表history與表similarities按照(compId, followCompId)做內(nèi)聯(lián)操作,獲得用戶(hù)感興趣的物品與其它物品的相似度:

    userId compId followCompId1 followCompId2 cosSim cosSim * count as simProduct
    1 1 2 3 0.5 0.5
    1 1 3 2 0.5 0.5
    2 1 2 4 0.7 2.1
    2 1 4 2 0.7 2.1
  3. 按照(userId, compId, followCompId2)分組計(jì)算用戶(hù)對(duì)其構(gòu)件的評(píng)分:

    userId compId followCompId2 sum(simProduct) / sum(cosSim)
    1 1 2 1
    1 1 3 1
    2 1 2 3
    2 1 4 3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耕漱,一起剝皮案震驚了整個(gè)濱河市螟够,隨后出現(xiàn)的幾起案子若河,更是在濱河造成了極大的恐慌萧福,老刑警劉巖竭业,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智润,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡未辆,警方通過(guò)查閱死者的電腦和手機(jī)窟绷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咐柜,“玉大人钾麸,你說(shuō)我怎么就攤上這事】唤埃” “怎么了饭尝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)献宫。 經(jīng)常有香客問(wèn)我钥平,道長(zhǎng),這世上最難降的妖魔是什么姊途? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任涉瘾,我火速辦了婚禮,結(jié)果婚禮上捷兰,老公的妹妹穿的比我還像新娘立叛。我一直安慰自己,他們只是感情好贡茅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布秘蛇。 她就那樣靜靜地躺著其做,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赁还。 梳的紋絲不亂的頭發(fā)上妖泄,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音艘策,去河邊找鬼蹈胡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朋蔫,可吹牛的內(nèi)容都是我干的罚渐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驯妄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荷并!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起富玷,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎既穆,沒(méi)想到半個(gè)月后赎懦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幻工,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年励两,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囊颅。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡当悔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出踢代,到底是詐尸還是另有隱情盲憎,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布胳挎,位于F島的核電站饼疙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慕爬。R本人自食惡果不足惜窑眯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望医窿。 院中可真熱鬧磅甩,春花似錦、人聲如沸姥卢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至却妨,卻和暖如春饵逐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彪标。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工晌块, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人想诅。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓王悍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親题画。 傳聞我的和親對(duì)象是個(gè)殘疾皇子默辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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