【推荐系统】协同过滤浅入(基于用户/项目/内容/混合方式)
目錄
?
協同過濾
基于用戶的過濾
基于項目的過濾
基于內容的過濾
混合系統
檢查每種類型的利弊
?
協同過濾
在 2012 年初,爆出了這樣一則新聞故事:一位男子進入一家Target商店,揮舞著手中的一疊優惠券,這些都是Target郵寄給他還在讀高中的女兒的。
他來的目的是譴責經理,因為這套優惠券都是諸如嬰兒服裝、配方奶和幼兒家具這類商品專享的。
聽到顧客的投訴,經理再三道歉。他感覺很糟糕,想在幾天后通過電話跟進,解釋這是怎么回事。
這個時候,反而是這位父親在電話里進行了道歉。看來他的女兒確實是懷孕了。
她的購物習慣泄露了她的這個秘密。
出賣這位女生的算法很可能是,至少部分是,基于協同過濾。
什么是協同過濾?
協同過濾(collaborative filtering)是基于這樣的想法,在某處總有和你趣味相投的人。假設你和趣味相投的人們評價方式都非常類似,而且你們都已經以這種方式評價了一組特定的項目,此外,你們每個人對其他人尚未評價的項目也有過評價。正如已經假設的那樣,你們的口味是類似的,因此可以從趣味相投的人們那里,提取具有很高評分而你尚未評價的項目,作為給你的推薦,反之亦然。在某種程度上,這點和數字化配對非常相像,但結果是你喜歡的歌曲或產品,而不是與異性的約會。
?
對于懷孕的高中生這個案例,當她購買了無味的乳液、棉球和維生素補充劑之后,她可能就和那些稍后繼續購買嬰兒床和尿布的人匹配上了。
?
基于用戶的過濾
我們將從被稱為效用矩陣(utility matrx)的東西開始。它和詞條-文檔矩陣相類似,不過這里我們表示的是產品和用戶,而不再是詞條和文檔。
這里,我們假設有顧客 A 到 D,以及他們所評分的一組產品,評分從 0 到 5
之前我們看到,當想要查找類似的項目時,可以使用余弦相似度。讓我們在這里試試。
我們將為用戶 A 發現最相似的其他顧客。由于這里的向量是稀疏的,包含了許多未評分的項目,我們將在這些缺失的地方輸入一些默認值,這里填入 0。
我們從用戶 A 和用戶 B 的比較開始。
fromsklearn.metrics.pairwise import cosine_similarity cosine_similarity(np.array([4,0,5,3,5,0,0]).reshape(1,-1),\np.array([0,4,0,4,0,5,0]).reshape(1,-1))我們可以看到,這兩者沒有很高的相似性,這是有道理的,因為他們沒有多少共同的評分。
現在來看看用戶 C 與用戶 A 的比較。
cosine_similarity(np.array([4,0,5,3,5,0,0]).reshape(1,-1),\np.array([2,0,2,0,1,0,0]).reshape(1,-1))我們看到他們有很高的相似度(記住 1 是完美的相似度),盡管他們對同樣產品的評價有所不同。為什么得到了這樣的結果?
問題在于我們對沒有評分的產品,選擇使用0 分。它表示強烈的(負的)一致性。在這種情況下, 0 不是中性的。
?
如何解決這個問題?
我們可以做的是重新生成每位用戶的評分,并使得平均分變為 0 或中性,而不是為缺失值簡單地使用 0。我們拿出每位用戶的評分,將其減去該用戶所有打分的平均值。
例如,對于用戶A,他打分的平均值為 17/4,或 4.25。然后我們從用戶 A 提供的每個單獨評分中減去這個值。
一旦完成,我們繼續找到其他用戶的平均值,從他們的每個評分中減去該均值,直到對每位用戶完成該項操作。
讓我們在新的數據集上嘗試余弦相似度。再次將用戶 A 和用戶 B、 C 進行比較。
A 和 B 之間的比較如下。
cosine_similarity(np.array([-.25,0,.75,-1.25,.75,0,0]).reshape(1,-1),\np.array([0,-.33,0,-.33,0,.66,0]).reshape(1,-1))A 和 C
cosine_similarity(np.array([-.25,0,.75,-1.25,.75,0,0]).reshape(1,-1),\np.array([.33,0,.33,0,-.66,0,0]).reshape(1,-1))我們可以看到, A 和 B 之間的相似度略有增加,而 A 和 C 之間的相似度顯著下降。這正是我們所希望的。
?
這種中心化的過程除了幫助我們處理缺失值之外,還有其他好處,例如幫助我們處理不同嚴苛程度的打分者,現在每位打分者的平均分都是 0 了。注意,這個公式等價于 Pearson相關系數,取值落在-1 和 1 之間。
?
讓我們現在采用這個框架,使用它來預測產品的評分。我們將示例限制為三位用戶 X、Y 和 Z,我們將預測 X 尚未評價, 而和 X 非常相似的 Y 和 Z 已經評過的產品,對于 X 而言會得到多少分。
?
先從每位用戶的基本評分開始
將中心化這些評分
?
想知道用戶 X 會給 Disposos' Diapers 打多少分。我們可以根據用戶評分中心化之后的余弦相似度獲得權重,并通過這些權重對用戶 Y 和用戶 Z 的評分進行加權計算。
先得到用戶 Y 和 X 的相似度。
計算用戶 Z 和 X 的相似度。
user_x = [0,.33,0,-.66,0,33,0] user_z = [0,-.125,0,-.625,0,.375,.375] cosine_similarity(np.array(user_x).reshape(1,-1),\np.array(user_z).reshape(1,-1))現在有一個用戶 X 和用戶 Y 之間的相似度(0.42447212),以及用戶 A 和用戶 Z 之間的相似度(0.46571861)
整合起來,我們通過每位用戶與 X 之間的相似度,對每位用戶的評分進行加權,然后除以總相似度。
(0.42447212 × (4) +0.46571861 × (4.5)) / (0.42447212 +0.46571861) = 4.26
用戶 X 對 Disposos' Diapers 的預估評分為 4.26
?
基于項目的過濾
這種方法遠優于基于用戶的過濾,它被稱為基于項目的過濾。這是它的工作原理:每個被評分項目與所有其他項目相比較,找到最相似的項,而不是根據評分歷史將每位用戶和所有其他用戶相匹配。同時,也是使用中心化余弦相似度。
我們有一個效用矩陣。這一次,我們將看看用戶對歌曲的評分。每一列是一位用戶,而每一行是一首歌曲。
想知道 U3 對于 S5 的評分。這里,我們會根據用戶對歌曲的評分來尋找類似的歌曲,而不是尋找類似的用戶。
從每行歌曲的中心化開始,并計算其他每首歌曲和目標歌曲(即 S5)的余弦相似度。
最右邊的列是其他每行相對行 S5 的中心化余弦相似度。
需要選擇一個數字, k,這是我們為預測 U3 對歌曲的評分,所要使用的最近鄰居數量。在這個簡單的例子中,我們使用 k = 2。
我們可以看到對于歌曲 S5, S1 和 S3 是和它最相似的,所以我們將使用 U3 對這兩首歌的評分(分別為 4 和 5)。
計算評分
(0.98 × (4) +0.72 × (5)) / (0.98 +0.72) = 4.42
通過基于項目的協同過濾,我們可以看到 U3 很可能給 S5 打出高分 4.42。
?
基于用戶的過濾不如基于項目的過濾有效,這是為什么呢?
很有可能,你的朋友和你有共同的愛好,但是你們每個人都有自己喜歡,而別人毫無興趣的領域。
?
?
基于內容的過濾
作為一個音樂家, Tim Westergren 花了幾年時間傾聽其他有天賦的音樂家的作品,想知道為什么他們永遠不能拔尖。他們的音樂很好,和你在電臺收聽到的那些一樣好。然而,不知何故,他們從來沒有大的突破。他想,一定是因為他們的音樂沒有在足夠的、合適的人們面前展示。
Tim 最終退出了音樂家的工作,開始從事電影背景音樂的作曲。在那里,他開始思考每一塊音樂自己獨特的結構或 DNA,并可以將其分解為不同的組成部分。思考一番之后,他開始考慮圍繞這個想法創建一家公司,建立一系列音樂的基因組。他的一位朋友曾經創建并出售了一家公司, Tim 讓他來運作這個想法。 Tim 的朋友喜歡他的想法,并開始幫助他寫一個商業計劃,并為該項目收集了首輪融資。行動開始了。
在接下來的幾年里,他們雇用了一小群音樂家,對上百萬首音樂細致地編寫了幾乎 400個不同的特征,每個特征從 0 到 5 進行打分——所有都是通過手,或者說是通過耳朵進行的。每首 3 到 4 分鐘長的歌曲需要幾乎半小時的評級。
這些特征包括如此的參數:如領唱歌手的聲音有多么的沉重,或節奏是每分鐘多少拍。
?
他們花費了近一年的時間完成了首個原型。它完全使用 Excel 中的 VBA 宏構建,花了差不多 4 分鐘才返回一次推薦結果。但是,最后,它成功了,運作得非常好。
我們現在知道這家公司就是 Pandora Music,你很可能已經聽說過或使用過其產品,因為每天它有來自世界各地數百萬的用戶。毫無疑問,它是基于內容過濾的成功范例。
在基于內容的過濾中,不再將每首歌曲視為一個不可分割的單位,而是將它變成特征向量,然后就可以使用我們的老朋友余弦相似度進行比較。
不僅歌曲可以被分解成為特征向量,聽眾也可以被轉化為特征向量。聽眾的品味描述成為了空間中的向量,使我們可以測量他們的品味描述和歌曲本身之間的相似程度。
對于 Tim Westergren 來說,這是神奇的,因為不像其他推薦引擎依賴于音樂的人氣,這個系統的推薦是基于固有的結構相似性。也許有人從來沒有聽過歌曲 X,但如果他們喜歡歌曲 Y,那么他們應該喜歡歌曲 X,因為這兩首歌在基因上是幾乎相同的。這就是基于內容的過濾。
?
混合系統
我們已經學習了推薦系統的兩種主要形式。但是,需要注意的是,在任何大規模生產
環境中,推薦引擎可能同時利用這兩項技術。這被稱為混合系統,人們喜歡混合系統的原
因是,它有助于消除使用單一系統時可能存在的缺點。這兩個系統在一起,創建了更強大
的解決方案。
檢查每種類型的利弊
協同過濾的優點如下。
?沒有必要手動創建特征。
協同過濾的缺點如下。
?如果沒有大量的項目和用戶,它不能正常工作。
?當項目數量遠遠超過可能被購買的數量時,效用矩陣會有稀疏性。
基于內容的過濾的優點如下。
?它不需要大量的用戶。
基于內容的過濾的缺點如下。
?定義正確的特征可能是一個挑戰。
?缺乏“意外的驚喜”
?
當一家公司缺乏大量的用戶群,基于內容的過濾是更好的選擇,但是隨著公司的增長,加入協同過濾可以幫助我們為用戶提供更多的“驚喜”。
?
?
摘自《Python機器學習實踐指南》
?
?
總結
以上是生活随笔為你收集整理的【推荐系统】协同过滤浅入(基于用户/项目/内容/混合方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言买金鱼问题答案,发现一条品相不错的
- 下一篇: MySQL中时间日期类型的使用