【JAVA】助力數字化營銷:基於協同過濾演算法實現個性化商品推薦

智在碧得發表於2024-04-23


​周松傑:碧桂園服務後臺開發gao級工程師,擁有8年開發經驗。

1 前言
本文主要介紹基於協同過濾的推薦演算法。在瞭解實踐應用之前,我們先對推薦系統、Mahout學習框架以及演算法進行簡單介紹,然後再結合實踐進行深入探討。

第一部分概述了推薦系統的產生背景、作用和工作原理,並介紹了Mahout學習框架的演算法。

第二部分則基於Mahout框架-協調過濾演算法,實現個性化商品推薦。

**2 推薦系統、智慧推薦演算法 **
2.1 推薦系統--基本流程講解
2.1.1 推薦系統的意義
使用者角度:推薦系統解決在“資訊過載”的情況下,使用者如何高效地獲得感興趣的物品的問題。例如在淘/寶、京/東、亞/馬/遜等。
公司角度:推薦系統解決了產品如何最大限度地吸引使用者、留存使用者、增加使用者黏性,從而達到公司的營收目的。

2.1.2 簡潔系統的推薦

如果每次都隨機給使用者推薦物品,則無法將平臺/獨特的優質物品展現出來。例如在鳳凰會商城中,我們可以根據使用者的收藏數、評論數、銷量等資料對內容進行排序,按倒序依次推薦給使用者。此外,還可以設定一個運營池和熱點池,由運營人員在後臺進行手動更新,確保實時熱點展示。

根據以上想法,我們畫一下推薦系統架構:

2.1.3 個性化(千人千面)推薦系統
基於以上的推薦系統,除了隨機策略外,不同使用者看到的商品是一致的,但每個使用者感興趣的物品不同。因此,推薦系統需要根據不同使用者進行個性化推薦。為了解決這個問題,可以採用不同的推薦演算法。常用的推薦演算法分為以下三種:

從圖中可以看出,協同過濾分為ItemCF(基於物品的協同過濾)和UserCF(基於使用者的協同過濾),也是本文要講的內容。基於Mahout一個分散式機器學習演算法框架來實現協同過濾推薦。

2.2 Mahout-Collaborative Filtering(CF)
2.2.1 Mahout簡介
Mahout是一個分散式機器學習演算法的集合和資料探勘工具,它整合了包括聚類、分類、推薦過濾和頻繁子項挖掘等演算法。本文提到Mahout,是因為它提供了豐富的演算法實現,有興趣的同學可以進行深入研究。

從上圖可以看出,Mahout的定位是基於原資料生成推薦商品資料。

2.2.2 什麼是協同過濾
協同過濾的基本概念是將推薦方式變成自動化流程。它主要基於屬性或興趣相近的使用者經驗和建議,提供個性化推薦。透過協同過濾,可以收集具有類似偏好或屬性的使用者,並將其意見提供給同一叢集中的其他使用者作為參考,以滿足人們在做決策時參考他人意見的心態。

2.2.3 ItemCF(基於商品的協同過濾)
演算法思想:基於使用者對物品的偏好找到相似物品,然後根據使用者歷史偏好,推薦相似物品。

計算方法:將所有使用者對某個物品的偏好作為一個向量,利用這些向量計算物品之間的相似度。得到相似物品後,根據使用者歷史偏好預測當前使用者還未涉及的物品偏好,最終計算出一個排序的物品列表作為推薦。

判斷兩個物品是否相似以及相似度為多少是協同過濾演算法的難點。對於物品來說,相似度計算往往與業務本身有關。在這裡,我們使用最通用的計算規則:如果喜歡兩個物品的使用者重合度越高,則證明物品越相似。


為了便於觀看,我們把上圖轉成矩陣形式,使用者作為矩陣行座標,物品作為列座標。

假設兩物品A和B,判斷相似度則透過使用者的重合度比例進行計算,如上圖協同過濾矩陣所示,要判斷「蘋果」與「橙子」的相似程度。

利用向量中餘弦相似度進行計算,公式為:

向量點積:

向量的長度:

向量的夾角:

將喜歡權重設定為1,不喜歡權重設定為-1,則「蘋果」向量為 (1, 1, 1, 1),「橙子」向量為 (1, 1, -1, 1)。

兩者向量點積:1 * 1 + 1 * 1 + 1 * -1 + 1 * 1 = 2

「蘋果」向量長度:2

「橙子」向量長度:2

利用餘弦相似度計算得出:

透過此方法以此類推可以將所有物品的相似度計算出來。

然而根據業務需求,「使用者」對「商品」行為有喜歡、評論、收藏及購買等多種型別。每種使用者行為都有不同的權重,例如喜歡是1,評論是2,收藏是4,購買是9(當前鳳/凰會商/城就是使用該種業務規則計算),將上圖換成對應的行為型別則為:

然後根據前面提到的公式進行套娃,則可以得出商品的相似度。在相似度計算上,任何合理的“向量相似度計算”都可以作為協同過濾的判斷依據,根據自身業務進行演算法迭代。

2.2.4 UserCF(基於使用者的協同過濾)
基本思想:基於使用者對物品的偏好找到鄰居使用者(相似使用者),然後將鄰居使用者喜歡的東西推薦給當前使用者。

計算方法:將一個使用者對所有物品的偏好作為一個向量,計算使用者之間的相似度。找到鄰居後,根據鄰居的相似度權重以及他們對物品的偏好,預測當前使用者未涉及的物品,計算得到一個排序的物品列表作為推薦。相似度即為兩個向量之間的距離,距離越小相似度越大。

判斷兩個使用者是否相似以及相似度為多少也是協同過濾演算法的難點。最常用的兩種判斷方式如下:

使用者購買商品有很大重合度。

使用者瀏覽商品有很大重合度。

在ItemCF我們已經說過,任何合理的判斷方法都可以作為相似度計算規則,下面我們以 “使用者喜歡的物品有很大重合度” 來作為相似度計算規則。


與ItemCF類似,我們也將有向圖轉變成矩陣,繼續沿用ItemCF矩陣。

ItemCF是以商品的維度進行得出向量,最後透過餘弦相似得出商品相似度。UserCF則以使用者的維度進行得出向量,最後透過餘弦相似得出商品相似度。

2.2.5 CF推薦工程化
1、離線計算

建立「使用者」到「商品」的索引,記錄每個使用者行為跟「商品」的列表,我們俗稱為LastN。給定一個「使用者ID」,能夠快速查詢到該使用者最近互動過的N個「商品」列表。

建立「商品」到「商品」的索引,利用相似度計算規則,離線計算出每個「商品」最相似的「商品」列表。給定一個「商品ID」,能夠快速查詢到最相似的TopK「商品」。

2、線上召回

根據當前「使用者ID」,透過「使用者」到「商品」索引查詢使用者行為-「商品」列表,再透過「商品」到「商品」索引,拿到最相似TopK「商品」集合。

以ItemCF為例:

3、其他召回方式

例如,根據地址位置進行推薦或者結合系統標籤使用者的形式進行推薦等等。

很多人估計想吐槽,說了這麼多,又是演算法計算,又要考慮各種維度才能得出相應的相似度來進行推薦,太麻煩了。別急,Mahout即將登場。

4、ItemCF、UserCF如何選擇

(1)基於使用者的協同過濾

基於使用者的協同過濾適用於物品數量多、時效性強的場景,但在其他情況下計算速度較慢。推薦結果個性化程度較弱,但具有廣泛的適用性和較高的驚喜度。

(2)基於物品的協同過濾

應用最廣泛,尤其以電商行業為典型。

適於使用者多、物品少的場景,否則計算速度慢。

在物品冷啟動、資料稀疏時效果不佳。

推薦精度高,更具個性化。

傾向於推薦同類商品,推薦的多樣性不足,形成資訊閉環。

對於稀疏資料集(例如delicious書籤、小眾群體收藏等),基於物品的過濾方法通常要優於基於使用者的過濾方法。而對於密集資料集而言,兩種方法的效果幾乎是一樣的。

——摘自《集體智慧程式設計》

2.2.6 Mahout推薦演算法以及引擎
注意:以下只列本文涉及到的演算法,更多演算法有興趣的可自行Google。

點選檢視程式碼

//DataModel支援資料庫以及檔案作為資料來源
org.apache.mahout.cf.taste.impl.model.file.FileDataModel  基於檔案的資料介面內,內部使用GenericDataModel 儲存實際的使用者評價資料,增加了壓縮檔案(.zip .gz)等檔案型別的支援,支援動態更新(更新檔案檔名必須儲存為一定的格式 例如 foo.txt.gz 後續更新檔案必須為foo.1.txt.gz)查了以下程式碼 好像是自定義時間間隔後可以更新,但是好像是全部更新(以後看程式碼)
org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel  基於資料庫的資料介面 
//UserSimilarity 和 ItemSimilarity 相似度演算法實現
CityBlockSimilarity :基於曼哈頓距離相似度
LogLikelihoodSimilarity :基於對數似然比的相似度
                          原理:重疊的個數,不重疊的個數,都沒有的個數
                          範圍:具體可去百度文庫中查詢論文《Accurate Methods for the Statistics of Surprise and Coincidence》
                          說明:處理無打分的偏好資料,比Tanimoto係數的計算方法更為智慧。
//UserNeighborhood 主要實現
NearestNUserNeighborhood:對每個使用者取固定數量N個最近鄰居
ThresholdUserNeighborhood:對每個使用者基於一定的限制,取落在相似度限制以內的所有使用者為鄰居

3 商品推薦的實現
3.1 鳳凰會商城引入智慧推薦的背景前言
3.1.1 需求背景
為更好地瞭解使用者需求,提高轉化率、使用者停留時間、瀏覽量和時長等指標,實現精準投放。

原業務流程:

透過運營後臺推薦,每天/月/年的商品曝光量最多十幾個(推薦策略不變的情況下),所有使用者看到的商品都是一樣。

新業務流程:

結合後臺運營推薦策略、演算法策略、銷量策略進行推薦。

3.2 Mahout結合實際落地應用流程
3.2.1 資料生命週期

資料完整得生命週期如上圖所示,分為以下幾個步驟:

資料來源:使用者的行為日誌以及其他行為(如購買行為等,根據業務需要而定)。

資料採集:從客戶端採集使用者的行為日誌。

資料儲存:日誌檔案或DB方式儲存。

資料計算:基於使用者的行為資料進行生成推薦資料。

資料應用。

注:第4點中的推薦資料生成是基於CachingItemSimilarity商品相似,EuclideanDistanceSimilarity基於歐幾里德距離計算相似度的演算法進行ItemCF協同過濾。

系統使用者行為採集

推薦模型訓練流程

3.2.2 實踐案例
Mahout推薦引擎提高效率的使用建議:

點選檢視程式碼
ReloadFromJDBCDataModel (這個很重要,佔整體耗時一半左右) 包裝DataModel的資料集

CachingUserSimilarity或者CachingItemSimilarity包裝使用者相似度或者物品相似度  
//以cache方式儲存相似度計算結果防止每次請求是重複計算
//內部使用 Cache<LongPair,Double> similarityCache儲存相似度
//如基於使用者推薦,則使用該類包裝相似結果集合
CachingUserNeighborh

效果展示:

假設商品推薦位最大為12個,根據以下邏輯優先順序進行補位:推薦置頂 > 演算法推薦 > 銷量。

後臺推薦置頂配置:

圖示:某個使用者所處同一個專案下推薦的商品:

結果期望:基於瀏覽記錄,推薦同類商品。

關閉演算法推薦後效果對比:

業務效果:



可以看出,自上線後,隨著開放的試點專案越多,透過推薦商品欄目轉化訂單量,從每月十來單增長到目前的峰值幾百單,增長了近二十倍(資料統計截至2023.12.11 0點)。

成交使用者數方面,在去重的情況下,6月份前成交人數是幾千人,而在後半年(截至12月份),成交人數已經達到了幾萬人。

4 總結

  1. Mahout是基於Hadoop的機器學習和資料探勘的一個分散式框架,是一個強大的演算法庫,具有極高的可擴充套件性以及易用性。此外,Mahout還提供了一些預處理和特徵提取的方法,幫助使用者快速構建機器學習模型,它還支援多種程式語言,如Java、Python等,方便不同背景的使用者使用。

  2. 本文沒有討論混合方法。在許多情況下,結合協同過濾和基於內容的方法可以達到最優的結果,因此在許多大型推薦系統中使用。混合方法的組合主要有兩種形式:一是可以獨立訓練兩個模型(一個協同過濾模型和一個基於內容的模型),二是直接構建一個統一這兩種方法的單一模型(通常是神經網路)。

  3. 可嘗試使用向量資料庫將商品資料向量化後,獲得商品之間的相似性,結合使用者畫像行為進行推薦。

  4. 可以結合使用者標籤畫像提高精準顆粒度。

  5. 針對提高推薦資料實時性,可採取縮短資料清洗週期(離線)、分散式(提高併發處理能力)或Canal監控,Flink及佇列等方式來消費使用者行為,從而提高使用者體驗。

  6. 推薦方法的核心是基於歷史資料,所以還需要考慮新物品和新使用者存在的“冷啟動”問題。

相關文章