《寫給程序員的數據挖掘實踐指南》學習筆記二

協同過濾——隱式評級及基于物品的過濾

第一篇講的是顯示評級,是用戶確實打了的分,是過于理想的情況,現實中有很多不可控因素,有時用戶打分口是心非,有時懶得打分,有時初次評價之后即使后來發現當初打分打低了,有時僅僅是與個人聯系緊密的獨家偏好……
隱式評級,不要求用戶打分,而是觀察用戶的行為,可觀察的維度很多:
上述講的都是基于用戶的過濾,也叫基于內存的過濾,意思是要進行大量的計算,尤其當用戶很多的時候,對計算機內存要求比較高。現在亞馬遜有上百萬用戶,計算擴展性是一個問題,更重要的是有時找不到最近鄰。基于以上原因,最好采用基于物品的過濾。也叫基于模型的過濾。

1. 基于物品的過濾

利用物品之間的相似度進行推薦。從所有商品中找出與用戶購買過的商品最相似的商品推薦給用戶。

2. 計算物品之間的相似度,使用調整后的余弦相似度

和第一篇的余弦相似度類似,為了消除分數貶值,調整后的余弦相似度與余弦相似度公式有一點不同,用戶U給物品i的打分減去用戶U對所有物品打分的平均值。因為是基于物品的推薦,所以如果使用之前的余弦相似度,就要用物品的每一列屬性中的每一項減去這一列的平均值,顯然與實際情況不符。

調整后的余弦相似度計算公式

U 表示所有同時對i和j 進行過評級的用戶的集合。
這個公式計算的是** 物品 i 和物品 j 之間的相似度 **。這個公式的直觀解釋是:

要計算 物品i 和 物品j 之間的相似度
 1. 找出同時對物品i和物品j打分的用戶
 2. 計算每個用戶對自己購買的書打分的平均值 R
 3. 按照公式計算
利用改進后的余弦相似度計算兩個物品之間的相似度

Python 代碼:

# -*- coding: utf-8 -*-
from math import sqrt
users3 = {"David": {"Imagine Dragons": 3, "Daft Punk": 5,
"Lorde": 4, "Fall Out Boy": 1},
"Matt": {"Imagine Dragons": 3, "Daft Punk": 4,
"Lorde": 4, "Fall Out Boy": 1},
"Ben": {"Kacey Musgraves": 4, "Imagine Dragons": 3,
"Lorde": 3, "Fall Out Boy": 1},
"Chris": {"Kacey Musgraves": 4, "Imagine Dragons": 4,
"Daft Punk": 4, "Lorde": 3, "Fall Out Boy": 1},
"Tori": {"Kacey Musgraves": 5, "Imagine Dragons": 4,
"Daft Punk": 5, "Fall Out Boy": 3}}

def computeSimilarity(band1, band2, userRatings):
    averages = {}
    for (key, ratings) in userRatings.items():
        averages[key] = (float(sum(ratings.values())) /len(ratings.values()))
    num = 0 # 分子
    dem1 = 0 # 分母的第一部分
    dem2 = 0
    for (user, ratings) in userRatings.items():
        if band1 in ratings and band2 in ratings:
            avg = averages[user]
            num += (ratings[band1] - avg) * (ratings[band2] - avg)
            dem1 += (ratings[band1] - avg) ** 2
            dem2 += (ratings[band2] - avg) ** 2
    return num / (sqrt(dem1) * sqrt(dem2))

print computeSimilarity('Kacey Musgraves', 'Lorde', users3)
print computeSimilarity('Imagine Dragons', 'Lorde', users3)
print computeSimilarity('Daft Punk', 'Lorde', users3)

得到的結果填入表中:

各物品之間的相似度矩陣

3. 利用相似度矩陣進行預測

公式如下圖,p(u,i) 指的是用戶u將對物品i的評分的預測值(即用戶u對物品i的喜歡程度)。
N 是用戶u的所有評級物品中每個和物品i得分相似的物品。存在在相似度矩陣中。R(u,N) 是u給N的評分。S(i,N)是i和N的相似度。

書中的圖

4. 對用戶的打分結果歸一化

類似皮爾遜相關系數對結果做處理的原因,讓用戶對物品的評分結果值位于-1到1之間。
公式如下圖所示,NR(u,N) 是歸一化的結果,即用戶u對物品N打分的結果的處理。MinR表示評級范圍(比如1~5)中的最小值,MaxR表示最大值。


對打分結果歸一化公式

計算舉例,很簡單,比如某人的對某本書的打分是2分,歸一化后結果如下:


將第3點里面的預測用戶打分的公式更新為:


最后用歸一化的結果反推真實的分數公式:



就得到了預測的打分。

5. Slope One 算法

據說 Slope One 算法簡潔,易實現,來自 Daniel Lemire 和 Anna Machlachlan 的論文 ↓

Slope One Predictors for Online Rating-Based Collaborative
Filtering” by Daniel Lemire and Anna Machlachlan (http://www.daniel-lemire.com/fr/abstracts/SDM2005.html).

1. 問題描述

假設 Amy 給 PSY 打了 3分,給 WH 打了 4 分,Ben 給 PSY 打了 4 分,想預測 Ben 給 WH 打多少分?
描述如圖:


我們直觀進行預測,依據只能是 Amy 對 WH 的打分,相對而言,Ben 對 WH 的打分可能是 5 分。
Slope One 算法將問題看成兩部分:

第一部分: 計算所有物品對的偏差
第二部分: 利用偏差進行預測

2. 計算偏差

數據如下:

計算物品i 到 物品j 的平均偏差的公式:
其中,card(S) 是S集合中的元素個數,X 是整個評分集合。
card(S(X))即為所有同時對i和j評分的用戶個數。

物品i到物品j的偏差的計算公式

舉個例子:

物品 swift 到 psy 的偏差
物品 psy 到 swift 的偏差

3. 利用加權的 Slope One 算法進行預測

公式如下:
該公式最終得出的結果是用戶對某物品的打分的預測值。其中,c(i,j) 表示所有同時對物品i和物品j打分的用戶數。


加權的 Slope One 算法

用戶u對所有除j(即要預測值的物品)外的打過分的物品

公式看似復雜,計算卻不復雜,舉個例子:
給出了Ben的評分表及物品之間的偏差表:

Ben的評分表及物品之間的偏差表
所有用戶打分情況

計算過程

6. 加權 Slope One : 推薦模塊

通過 Slope One 算法得出用戶對某一商品的預測值,如何對用戶推薦呢?
(整個的利用 Slope One 算法推薦商品的代碼在這里)

  1. 先從一大堆商品中找出用戶沒有打過分的商品,并且用戶評過分的商品與未評過分的商品之間的偏差存在。
  1. 用 Python 程序計算所有用戶對未評過分的商品的可能評分。
  2. 根據預測分數由高到低展示出來(可只展示前幾項),排名越靠前,推薦給用戶的可能性越高。

作業:對 數據集 中的10部影片進行評級,看看 Slope One 推薦系統會給你推薦哪些影片。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容