推薦系統算法初探

申小明77 8年前發布 | 10K 次閱讀 算法 推薦系統 機器學習

0、序言

最近因為PAC平臺自動化的需求,開始探坑推薦系統。這個乍一聽去樂趣無窮的課題,對于算法大神們來說是這樣的:

而對于剛接觸這個領域的我來說,是這樣的:

在深坑外圍徘徊了一周后,我整理了一些推薦系統的基本概念以及一些有代表性的簡單的算法,作為初探總結,也希望能拋磚引玉,給同樣想入坑的伙伴們提供一些思路。

1、什么是推薦系統?

推薦系統是啥?

如果你是個多年電商(剁手)黨,你會說是這個:

如果你是名充滿文藝細胞的音樂發燒友,你會答這個:

如果你是位活躍在各大社交平臺的點贊狂魔,你會答這個:

沒錯,猜你喜歡、個性歌單、熱點微博,這些都是推薦系統的輸出內容。從這些我們就可以總結出,推薦系統到底是做什么的。

目的1、幫助用戶找到想要的商品(新聞/音樂/……),發掘長尾

幫用戶找到想要的東西,談何容易。商品茫茫多,甚至是我們自己,也經常點開淘寶,面對眼花繚亂的打折活動不知道要買啥。在經濟學中,有一個著名理論叫長尾理論(The Long Tail)。

套用在互聯網領域中,指的就是最熱的那一小部分資源將得到絕大部分的關注,而剩下的很大一部分資源卻鮮少有人問津。這不僅造成了資源利用上的浪費,也讓很多口味偏小眾的用戶無法找到自己感興趣的內容。

目的2、降低信息過載

互聯網時代信息量已然處于爆炸狀態,若是將所有內容都放在網站首頁上用戶是無從閱讀的,信息的利用率將會十分低下。因此我們需要推薦系統來幫助用戶過濾掉低價值的信息。

目的3、提高站點的點擊率/轉化率

好的推薦系統能讓用戶更頻繁地訪問一個站點,并且總是能為用戶找到他想要購買的商品或者閱讀的內容。

目的4、加深對用戶的了解,為用戶提供定制化服務

可以想見,每當系統成功推薦了一個用戶感興趣的內容后,我們對該用戶的興趣愛好等維度上的形象是越來越清晰的。當我們能夠精確描繪出每個用戶的形象之后,就可以為他們定制一系列服務,讓擁有各種需求的用戶都能在我們的平臺上得到滿足。

2、推薦算法

算法是什么?我們可以把它簡化為一個函數。函數接受若干個參數,輸出一個返回值。

算法如上圖,輸入參數是用戶和item的各種屬性和特征,包括年齡、性別、地域、商品的類別、發布時間等等。經過推薦算法處理后,返回一個按照用戶喜好度排序的item列表。

推薦算法大致可以分為以下幾類[1]:

  • 基于流行度的算法
  • 協同過濾算法
  • 基于內容的算法
  • 基于模型的算法
  • 混合算法

2.1 基于流行度的算法

基于流行度的算法非常簡單粗暴,類似于各大新聞、微博熱榜等,根據PV、UV、日均PV或分享率等數據來按某種熱度排序來推薦給用戶。

這種算法的優點是簡單,適用于剛注冊的新用戶。缺點也很明顯,它無法針對用戶提供個性化的推薦。基于這種算法也可做一些優化,比如加入用戶分群的流行度排序,例如把熱榜上的體育內容優先推薦給體育迷,把政要熱文推給熱愛談論政治的用戶。

2.2 協同過濾算法

協同過濾算法(Collaborative Filtering, CF)是很常用的一種算法,在很多電商網站上都有用到。CF算法包括基于用戶的CF(User-based CF)和基于物品的CF(Item-based CF)。

基于用戶的CF原理如下:

1、分析各個用戶對item的評價(通過瀏覽記錄、購買記錄等);

2、依據用戶對item的評價計算得出所有用戶之間的相似度;

3、選出與當前用戶最相似的N個用戶;

4、將這N個用戶評價最高并且當前用戶又沒有瀏覽過的item推薦給當前用戶。

示意圖如下:

基于物品的CF原理大同小異,只是主體在于物品:

1、分析各個用戶對item的瀏覽記錄。

2、依據瀏覽記錄分析得出所有item之間的相似度;

3、對于當前用戶評價高的item,找出與之相似度最高的N個item;

4、將這N個item推薦給用戶。

示意圖如下:

舉個栗子,基于用戶的CF算法大致的計算流程如下:

首先我們根據網站的記錄計算出一個用戶與item的關聯矩陣,如下:

圖中,行是不同的用戶,列是所有物品,(x, y)的值則是x用戶對y物品的評分(喜好程度)。我們可以把每一行視為一個用戶對物品偏好的向量,然后計算每兩個用戶之間的向量距離,這里我們用余弦相似度來算:

然后得出用戶向量之間相似度如下,其中值越接近1表示這兩個用戶越相似:

最后,我們要為用戶1推薦物品,則找出與用戶1相似度最高的N名用戶(設N=2)評價的物品,去掉用戶1評價過的物品,則是推薦結果。

基于物品的CF計算方式大致相同,只是關聯矩陣變為了item和item之間的關系,若用戶同時瀏覽過item1和item2,則(1,1)的值為1,最后計算出所有item之間的關聯關系如下:

我們可以看到,CF算法確實簡單,而且很多時候推薦也是很準確的。然而它也存在一些問題:

1、依賴于準確的用戶評分;

2、在計算的過程中,那些大熱的物品會有更大的幾率被推薦給用戶;

3、冷啟動問題。當有一名新用戶或者新物品進入系統時,推薦將無從依據;

4、在一些item生存周期短(如新聞、廣告)的系統中,由于更新速度快,大量item不會有用戶評分,造成評分矩陣稀疏,不利于這些內容的推薦。

對于矩陣稀疏的問題,有很多方法來改進CF算法。比如通過矩陣因子分解(如LFM),我們可以把一個n m的矩陣分解為一個n k的矩陣乘以一個k*m的矩陣,如下圖:

這里的k可以是用戶的特征、興趣愛好與物品屬性的一些聯系,通過因子分解,可以找到用戶和物品之間的一些潛在關聯,從而填補之前矩陣中的缺失值。

2.3 基于內容的算法

CF算法看起來很好很強大,通過改進也能克服各種缺點。那么問題來了,假如我是個《指環王》的忠實讀者,我買過一本《雙塔奇兵》,這時庫里新進了第三部:《王者歸來》,那么顯然我會很感興趣。然而基于之前的算法,無論是用戶評分還是書名的檢索都不太好使,于是基于內容的推薦算法呼之欲出。

舉個栗子,現在系統里有一個用戶和一條新聞。通過分析用戶的行為以及新聞的文本內容,我們提取出數個關鍵字,如下圖:

將這些關鍵字作為屬性,把用戶和新聞分解成向量,如下圖:

之后再計算向量距離,便可以得出該用戶和新聞的相似度了。這種方法很簡單,如果在為一名熱愛觀看英超聯賽的足球迷推薦新聞時,新聞里同時存在關鍵字體育、足球、英超,顯然匹配前兩個詞都不如直接匹配英超來得準確,系統該如何體現出關鍵詞的這種“重要性”呢?這時我們便可以引入詞權的概念。在大量的語料庫中通過計算(比如典型的TF-IDF算法),我們可以算出新聞中每一個關鍵詞的權重,在計算相似度時引入這個權重的影響,就可以達到更精確的效果。

sim(user, item) = 文本相似度(user, item) * 詞權

然而,經常接觸體育新聞方面數據的同學就會要提出問題了:要是用戶的興趣是足球,而新聞的關鍵詞是德甲、英超,按照上面的文本匹配方法顯然無法將他們關聯到一起。在此,我們可以引用話題聚類:

利用word2vec一類工具,可以將文本的關鍵詞聚類,然后根據topic將文本向量化。如可以將德甲、英超、西甲聚類到“足球”的topic下,將lv、Gucci聚類到“奢侈品”topic下,再根據topic為文本內容與用戶作相似度計算。

綜上,基于內容的推薦算法能夠很好地解決冷啟動問題,并且也不會囿于熱度的限制,因為它是直接基于內容匹配的,而與瀏覽記錄無關。然而它也會存在一些弊端,比如過度專業化(over-specialisation)的問題。這種方法會一直推薦給用戶內容密切關聯的item,而失去了推薦內容的多樣性。

2.4 基于模型的算法

基于模型的方法有很多,用到的諸如機器學習的方法也可以很深,這里只簡單介紹下比較簡單的方法——Logistics回歸預測。我們通過分析系統中用戶的行為和購買記錄等數據,得到如下表:

表中的行是一種物品,x1~xn是影響用戶行為的各種特征屬性,如用戶年齡段、性別、地域、物品的價格、類別等等,y則是用戶對于該物品的喜好程度,可以是購買記錄、瀏覽、收藏等等。通過大量這類的數據,我們可以回歸擬合出一個函數,計算出x1~xn對應的系數,這即是各特征屬性對應的權重,權重值越大則表明該屬性對于用戶選擇商品越重要。

在擬合函數的時候我們會想到,單一的某種屬性和另一種屬性可能并不存在強關聯。比如,年齡與購買護膚品這個行為并不呈強關聯,性別與購買護膚品也不強關聯,但當我們把年齡與性別綜合在一起考慮時,它們便和購買行為產生了強關聯。比如(我只是比如),20~30歲的女性用戶更傾向于購買護膚品,這就叫 交叉屬性 。通過反復測試和經驗,我們可以調整特征屬性的組合,擬合出最準確的回歸函數。最后得出的屬性權重如下:

基于模型的算法由于快速、準確,適用于實時性比較高的業務如新聞、廣告等,而若是需要這種算法達到更好的效果,則需要人工干預反復的進行屬性的組合和篩選,也就是常說的Feature Engineering。而由于新聞的時效性,系統也需要反復更新線上的數學模型,以適應變化。

2.5 混合算法

現實應用中,其實很少有直接用某種算法來做推薦的系統。在一些大的網站如Netflix,就是融合了數十種算法的推薦系統。我們可以通過給不同算法的結果加權重來綜合結果,或者是在不同的計算環節中運用不同的算法來混合,達到更貼合自己業務的目的。

2.6 結果列表

在算法最后得出推薦結果之后,我們往往還需要對結果進行處理。比如當推薦的內容里包含敏感詞匯、涉及用戶隱私的內容等等,就需要系統將其篩除;若數次推薦后用戶依然對某個item毫無興趣,我們就需要將這個item降低權重,調整排序;另外,有時系統還要考慮話題多樣性的問題,同樣要在不同話題中篩選內容。

3、推薦結果評估

當推薦算法完成后,怎樣來評估這個算法的效果?CTR(點擊率)、CVR(轉化率)、停留時間等都是很直觀的數據。在完成算法后,可以通過線下計算算法的RMSE(均方根誤差)或者線上進行ABTest來對比效果。

4、改進策略

用戶畫像是最近經常被提及的一個名詞,引入用戶畫像可以為推薦系統帶來很多改進的余地,比如:

1、打通公司各大業務平臺,通過獲取其他平臺的用戶數據,徹底解決冷啟動問題;

2、在不同設備上同步用戶數據,包括QQID、設備號、手機號等;

3、豐富用戶的人口屬性,包括年齡、職業、地域等;

4、更完善的用戶興趣狀態,方便生成用戶標簽和匹配內容。

另外,公司的優勢——社交平臺也是一個很好利用的地方。利用用戶的社交網絡,可以很方便地通過用戶的好友、興趣群的成員等更快捷地找到相似用戶以及用戶可能感興趣的內容,提高推薦的準確度。

5、總結

隨著大數據和機器學習的火熱,推薦系統也將愈發成熟,需要學習的地方還有很多,坑還有很深,希望有志的同學共勉~

 

 

來自:http://h2ex.com/1367

 

 本文由用戶 申小明77 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!