1. 程式人生 > >深入淺出推薦系統之簡單推薦模型

深入淺出推薦系統之簡單推薦模型

先來回答一個最關鍵的問題:到底什麼是推薦系統?

下面從3個角度來回答:

  • 它能做什麼

  • 它需要什麼

  • 它怎麼做

先來第一個問題推薦系統能做啥?

推薦系統可以把那些最終會在使用者(User)和物品(Item)之間產生的連線提前找出來。

此處關鍵就在於提前二字,推薦系統要從一個巨大的網路中,去提前發現人和物品之間的連線,並幫助這條連線儘可能早的建立起來。

第二個問題它需要什麼?
發現人和物品之間連線的前提是,已經有足夠多的連線存在了,推薦系統才可能去預測未來的連線。

第三個問題,怎麼做?
有很多方式,本系列主要講通過機器學習的方式。

我們現在知道了什麼是推薦系統後,再來看下一個問題:我們什麼時候需要推薦系統?

前面從3個方面介紹了什麼是推薦系統,我們如果需要去預測連線,並且已經有足夠多的連線了,那這個時候推薦系統就是必須的了。

上面有一個不好量化的點是:怎麼去定義連線是否足夠多?首先我們得知道影響人和物品連線的因素有哪些?

1. 第一自然是物品數本身,如果產品中物品很少,少到用人工就可以應付過來,那麼使用者產生的連線肯定不多,因為連線數量的瓶頸在於物品的數量,這時候不適合搭建推薦系統。

2. 第二是使用者和物品數量在某些手段下也變得很多,但是使用者和物品之間的連線很少,表現就是使用者的留存回訪很低,這時候也不是很需要一個推薦系統,此時應該想辦法找到使用者流失的原因,直到他們能貢獻第一批連線才行

我們有一個簡單的公式來判斷是否需要推薦系統:
640?wx_fmt=png
分子是增加的連線數,分母是增加的活躍使用者數和增加的有效物品數。

  • 如果增加的連線數主要靠增加的活躍使用者數和增加的物品數貢獻,則該值會較小,不適合加入推薦系統;

  • 如果增加的連線數和新增活躍使用者和物品關係不大,那說明連線數已經有自發生長的趨勢了,適合加入推薦系統加速這一過程。

下面我們開始介紹最簡單的推薦系統:基於流行度的推薦模型。

640?wx_fmt=png

流行度模型

推薦系統中最基本的推薦模型:基於流行度的推薦模型,通俗講就是什麼內容吸引使用者就推薦使用者什麼內容。

這邊一個衡量內容的標準是流行度,而影響物品流行度的因素有兩個:

  • 時間:上下班時間,大家開啟頭條的可能性會大於其他時間段,自然文章的關注度就高,但是這並不能表明文章的質量就高。

  • 位置:這個“位置”並不是真正的地理位置,而是在一個服務或者網站的什麼位置顯示你的物品。比如說,在絕大多數的搜尋引擎服務中,排名第一的物品所受到的關注度很可能大大高於排名第二和之後的物品。

因此,我們在衡量流行度上就不能使用絕對值,而應該使用的是一個“比值”(Ratio),或者是計算某種“可能性”(Probability)。

一個可行的方式就是計算點選率。如果從數學上對點選率建模,其實可以把一個物品在顯示之後是否被點選看成是一個“伯努利隨機變數”,於是對點選率的估計,就變成了對一個伯努利分佈引數估計的過程。

對於伯努利引數估計,我們可以採用最大似然估計,假設點選的概率為p,則總共N次展現,其中有n次點選,則出現的概率為:

P = p^n * (1-p)^(N-n)

對上面的概率兩邊取log,得到

log(P) = nlog(p) + (N-n)log(1-p)

求導,得到p=n/N的時候得到極值。

但是當物品的N或者n為0的時候,此時通過最大似然得到的p其實都不是很準確。

於是現在我們遇到的問題是:N或者n為0 的時候,此時最大似然估計並不能很好地反應這些物品的真實屬性。

一種解決方法是採用先驗分佈,這就引出了共軛先驗分佈的概念。

伯努利分佈的共軛分佈是beta分佈,其用到了貝葉斯公式,其核心公式是:

後驗分佈 = 似然函式* 先驗分佈/ P(X)

關於共軛先驗這部分可以檢視之前的文章主題模型:LDA 數學基礎(https://www.zybuluo.com/zhuanxu/note/1016850),此處我們知道Beta分佈給出了p的先驗分佈即可。

另外一種解決方案是基於不同的時間段來預估點選率,我們可以使用上一時間段的點選率作為先驗知識來更加準確地估計現在這個時段的點選率。

相似度模型

介紹完基於流行度的推薦模型後,我們接著看基於相似資訊的推薦模型,這類模型又叫做協同過濾,其總結起來就是:

相似的使用者可能會有相似的喜好,相似的物品可能會被相似的人所偏好。

於是我們就要去尋找相似的使用者或者相似的物品。

協同過濾的核心思想是借用資料,具體理解就是在使用者 A 資料不足的情況下,我們挖掘到可以借鑑的使用者 B,從而利用使用者B的資料來完善A。

其原理是我們把使用者 A 和使用者 B“聚類”到了一起,認為他們代表了一個型別的使用者。我們把對單個使用者的建模抽象到了某個型別的使用者,從而能夠獲得更多的資料。

協同主要有兩類:

  • 基於記憶的協同

    • 使用者協同

    • 物品協同

  • 基於模型的協同

基於記憶的協同,其重點在於記憶,記住每個人消費過的物品,然後給他推薦,此時又可細分為

  • 使用者協同:跟你相似的人都消費過什麼

  • 物品協同:跟你消費過物品相似的物品有哪些

因此基於記憶的協同,重點就在於去找相似的使用者或者相似的物品,我們先來看相似的使用者。

使用者協同

使用者協同背後的思想是:根據使用者的歷史行為,對使用者進行聚類,然後基於同一類使用者的共同喜好,給使用者推薦物品。

使用者協同的核心公式:

640?wx_fmt=png

我們來解讀下上面的公式: 

公式左邊的640?wx_fmt=png表示使用者u對物品i的預測,公式右邊是一個關於使用者u和使用者j的一個相似度加權,640?wx_fmt=jpeg表示使用者u和使用者j的相似度,640?wx_fmt=png表示使用者j對物品i的評分。

有了上面的公式後,我們就來看實際生產中要運用的話,需要注意的幾個地方:

1. 使用者向量我們通過物品來表示,如果物品個數很多,則使用者向量維度很高,計算向量相似度耗時

2. 因為要計算任意兩個使用者的相似度,所有複雜度為640?wx_fmt=jpeg

3. 要計算每個使用者和物品之間的相互關係,複雜度是640?wx_fmt=jpeg

針對上面的問題,可以看我github上的程式碼(https://github.com/zhuanxuhit/kaggle/blob/master/tencentAd/2-協同過濾版本.ipynb)是如何解決的,歡迎大家star。

物品協同

物品協同的關鍵公式如下: 

640?wx_fmt=png
有了前面使用者協同的基礎後,可以很容易的看懂。此處我們需要記住的關鍵點是:

  • 使用者協同由於使用者基數遠大於物品數,所有計算成本高

  • 使用者協同中,使用者和使用者之間有共同的消費行為實際上是比較少的,即使有一般也都是熱門物品,對使用者相似度計算幫助不大

  • 使用者的喜好相比於物品的特徵變化快

總結來說:物品協同就是根據使用者已有記錄的物品,去找跟這些物品最相似的物品。

slope one 演算法

slope one 演算法是面對物品協同中模型無法線上更新的問題而提出的。

640?wx_fmt=png

其主要創新點在於引入了:

1. 通過引入兩個物品的共同使用者數量來代表兩個物品差距的置信程度

2. 模型可以線上實時更新

總結

本文介紹了兩種推薦模型:

  • 基於流行度的推薦模型

  • 基於相似資訊的推薦模型和基於內容特徵的推薦模型

其中基於流行度的模型簡單有效,可以通過一些先驗知識,解決部分冷啟動問題,而基於相似資訊的推薦模型則是充分利用群裡智慧,通過聚類的方式來解決使用者、物品稀疏的問題。

出處:https://www.zybuluo.com/zhuanxu/note/1104086

版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝。

640?wx_fmt=png

架構文摘

ID:ArchDigest

網際網路應用架構丨架構技術丨大型網站丨大資料丨機器學習

640?wx_fmt=jpeg

更多精彩文章,請點選下方:閱讀原文