如何構建推薦系統

哥不是小蘿莉發表於2020-04-19

1.概述

最近有被諮詢到一些關於推薦系統的問題,今天筆者將為大家分享一些關於如何構建一個推薦系統。

2.內容

2.1 什麼是推薦系統?

推薦系統是一種資訊過濾系統,它旨在預測使用者對某項商品的評價。然後,此預測的評分用於向使用者推薦商品。預測評分較高的商品將推薦給使用者,這個推薦系統用於推薦範圍廣泛的專案。比如,它可以用於推薦電影、產品、視訊、視訊、音樂、新聞、書籍、衣服、遊戲、酒店、餐飲、路線等等。幾乎所有的大公司都使用它來增強業務,豐富使用者的體驗,例如騰訊、優酷、愛奇藝這類推薦視訊,淘寶、京東推薦商品,微信、QQ推薦好友等。

2.2 USER-ITEM矩陣

 

 在上圖中的USER-ITEM矩陣中,每一行代表一個使用者,每一列代表一個物品,每一個單元格代表一個使用者對一個物品的評分。總共有N個使用者和M和物品。這裡Aij是使用者Ui對物品Ij的評分,Aij級別範圍這裡定義為1到5。如果一個矩陣表示一個使用者Ui是否觀察了一個物品Ij,同樣也可以使用二進位制來表示,例如這裡Aij要麼是0,要麼是1。

USER-ITEM矩陣是非常稀疏的矩陣,這意味著此矩陣中的許多單元格都是空的。因為,單個使用者無法對所有的物品進行評分。在現實情況中,一個使用者給總物品數的評分不到1%。因此,這個矩陣中大約99%的單元都是空的。這些空單元格可以使用NaN表示,而不是數字。假如,N是100萬,M是1萬,那麼N*M=106*104=1010就是一個非常大的數字。現在一個普通使用者給5個物品打分,那麼平均給出的評級總數將是5*100萬=5*106評級。矩陣稀疏度計算公式如下:

矩陣稀疏度 = 空單元數 / 總單元數

將案例中的值帶入公式計算,矩陣稀疏度 = (1010-5*106) / 1010 = 0.9995

這意味著99.95%的單元格都是空的,這實際上是極端稀疏的。而推薦系統的任務是,假設一個使用者Ui喜歡物品I1I5I7。然後我們必須向使用者Ui推薦一個他/她最可能喜歡的Ij物品。

2.3 推薦系統型別

 

下面我們通過一些例子來理解推薦系統的型別。

2.3.1 協同過濾

 

假設有4個使用者和4個物品如上圖所示,4個使用者都購買了物品1和物品2。使用者1、使用者2、使用者3也購買了物品3,但是使用者4還沒有看到物品3.因此,物品3可以推薦給使用者4,現在只有使用者3購買了物品4,因此,我們不能向使用者4推薦物品4,因為只有使用者4購買了物品4,而其他使用者沒有購買物品4,這就是協作過濾的工作原理。

注意:
在這裡,使用者1、使用者2、使用者3,這三個使用者過去都統一購買了物品3,因此在未來使用者4可能會喜歡物品3,這是使用者1、使用者2、和使用者3過去對物品3的統一喜好

 

2.3.2 內容過濾

 

基於內容的過濾在方法上與經典的機器學習技術相似。它需要一種表示物品Ij和使用者Ui的方法。在這裡,我們需要收集關於物品Ij和使用者Ui的資訊,然後我們需要建立物品Ij和使用者Ui的特性。最後,我們將這些特徵結合起來,並將它們輸入到機器學習模型中進行訓練。這裡Label是使用者Ui對物品Ij給出的評分。

一旦我們有了上面提到的關於物品和使用者的資訊,我們就可以建立一個物品向量,其中應該包含關於上面提到的物品資訊。然後,我們可以類似的建立一個使用者向量,該向量應該包含關於上述使用者的資訊,我們可以為每個使用者Ui和物品Ij生成特性。最後結合這些特性,建立適合於機器學習模型的大資料集。

注意:
在這裡,剛剛解釋了一種建立基於內容的過濾特性的近似方法。這些功能應經過精心設計,以便在不相互依賴的情況下直接影響評分(標籤)。最後儘可能建立獨立的功能,同時它們應該非常依賴於評分(標籤),這意味著它們應該直接影響評分(標籤)。

 

2.3.3 相似過濾

2.3.3.1 使用者相似

 

 上圖是一個非常簡單的基於使用者相似的推薦。實現步驟如下:

第一步:構建使用者與使用者之間的相似矩陣

 

如上圖,每一行代表一個使用者,其中包含一個使用者對所有物品給出的評分。例如,對應於使用者Ui的行是大小為m的向量。因此,上述矩陣的每一行都是一個列向量(預設情況下,每個向量都是列向量),大小為m。現在,我們可以構造一個使用者之間的相似矩陣,它將是一個大小為n*n的平方對稱矩陣,在這裡,我們可以使用餘弦相似度計算兩個使用者之間的相似度。

 

 

 

 在這裡,兩個使用者將是相似的基礎上,他們給出了相似的評分。如果任何兩個使用者是相似的,那麼這意味著他們都對物品給出了非常相似的評分,因為這裡的使用者向量只不過是USER-ITEM矩陣的一行,而該行又包含了使用者對物品給出的評分。因為餘弦相似度可以從0到1,並且1表示最高相似度,所以所有對角線元素都將是1,因為使用者與使用者之間的相似度最高。這裡Sim12是使用者U1和使用者U2的相似性得分。以此類推,Simij是使用者Ui和使用者Uj的相似性得分。

第二步:找到相似使用者

第三步:選擇相似使用者喜歡的物品

第四步:推薦物品

2.3.3.2 物品相似

 

第一步:建立物品之間的相似矩陣

 

在這裡,兩個物品將在所有使用者對兩個物品給出相似評分的基礎上相似。如果任何兩個物品是相似的,那麼這意味著所有使用者對它們都給出了非常相似的評分,因為這裡的物品向量只是USER-ITEM矩陣的列,而USER-ITEM矩陣的列又包含使用者對物品的評分。因為餘弦相似度可以從0到1,並且1表示最高相似度,所以所有對角線元素都將是1,因為具有相同項的相似度最高。這裡Sim12是使用者I1和使用者I2的相似性得分。以此類推,Simij是使用者Ii和使用者Ij的相似性得分。

第二步:找出相似的物品然後推薦

2.3.4 矩陣分解

關於矩陣分解是比較有意思的,這裡我們可以來看看一個計算公式:

 

 這裡以日常生活中的電影來作為例子。例如,每個使用者看電影的時候都有偏好,這些偏好可以直觀的理解成:喜劇、動作、愛情、動漫等。特性矩陣(使用者)表示的就是使用者對這些因素的喜歡程度。同樣,每一部電影也可以用這些因素描述,因此物品矩陣表示的就是每一部電影這些因素的含量,也就是電影的型別。這樣子兩個矩陣相乘就會得到使用者對這個電影的喜歡程度。

3.總結

推薦系統的型別,簡要概述如下:

  • 協同過濾:簡單來說,就是利用某興趣相投,擁有功能經驗的群體喜好來推薦使用者感興趣的資訊,個人通過合作的機制給予資訊相當程度的評分,並記錄下來以達到過濾的目的,進而幫助別人篩選資訊,回應不一定侷限於特別感興趣的,特別不感興趣資訊的記錄也是相當重要。
  • 內容過濾:通過在抓取每個物品的一系列特徵來構建物品檔案,以及使用者購買的商品特徵來構建基於內容的使用者檔案。使用者檔案和商品檔案都以使用資訊提取技術或資訊過濾技術,提取的關鍵詞集合來表示。鑑於兩個檔案都以權重向量的形式來表,則相似度分別則可以使用如餘弦近似度方程等啟發式方程來計算得到。其他的技術如分類模型,構建一個統計方法或者資料探勘方法,來判斷文件內容和使用者是否相關。
  • 相似過濾:找到和目標使用者興趣相似的使用者集合,以及找到這個集合中的使用者喜歡的,且目標使用者沒有聽說過的物品推薦給目標使用者(基於使用者相似)。計算物品之間的相似度,以及根據物品的相似度和使用者的歷史行為給使用者生成推薦列表(基於物品相似)。
  • 矩陣分解:簡單來說,就是每一個使用者和每一個物品都會有自己的一些特性,用矩陣分解的方法可以從評分矩陣中分解出使用者(如特性矩陣、物品矩陣)。這樣做的好處其一是得到了使用者的偏好和每一件物品的特性,其二是分解了矩陣的維度。

4.結束語

這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

另外,博主出書了《Kafka並不難學》和《Hadoop大資料探勘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學視訊。

相關文章