1. 程式人生 > >聊一聊推薦系統

聊一聊推薦系統

推薦系統的應用場景有很多:新聞推薦(今日頭條),音樂推薦(網易雲音樂),商品推薦(京東,天貓),電影推薦等。今天我們就來聊一聊就在我們身邊的推薦系統。

1.推薦系統的基本原理(以電影推薦為例

1)基於內容的電影推薦系統原理

我們可以根據電影評分表矩陣電影內容矩陣求出我們想要的使用者喜好矩陣。使用者喜好矩陣中包含的是每個使用者對每種電影的喜好程度。使用者喜好矩陣的求解公式如下:


基於內容的電影推薦系統存在的問題是:電影內容矩陣的構建十分麻煩。我們很難計算一部電影中愛情成分,喜劇成分,武俠成分。

2)基於協同過濾的電影推薦系統的原理


我們根據電影評分表矩陣

使用者喜好矩陣,可以求出電影內容矩陣。電影內容矩陣求解的公式如下:

基於協同過濾的電影推薦系統所存在的問題是:我們可以通過線上問卷調查的方式收集使用者對電影的評價,但是問題在於並不是所有的使用者都會填寫線上問卷調查。就算使用者填寫了也不一定填寫的是正確資訊。

那麼我們該如何解決這種問題呢?我們可以採用一種更加高效的方式來同時求解使用者喜好矩陣和電影內容矩陣。求解公式如下:

我們首先需要隨機初始化電影內容矩陣和使用者喜好矩陣,我們的目標是最小化這個公式的結果,我們可以採用梯度下降演算法或者其它的優化演算法,最終我們求解得到對於電影評分表擬合效果比較好的電影內容矩陣和使用者喜好矩陣。使用這種方法的好處在於 我們只需要有使用者對電影的評分就可以了,系統會自動判斷使用者對於不同型別的電影的喜好程度以及電影的內容。

上面我們實現協同過濾的方法叫做矩陣分解(Matix Factorization),在矩陣分解中我們會得到兩個矩陣。在本文中我們會得到一個電影矩陣和使用者喜好矩陣。那麼我們怎麼使用我們得到這兩個矩陣進行電影推薦呢?假設我要對使用者A進行電影推薦,我們可以看一下這個使用者看過哪些電影,然後使用電影內容矩陣找到與使用者看過的電影相似的電影,然後推薦給該使用者。我們也可以使用使用者喜好矩陣找到與使用者A相似的其他的使用者,將與之相似的其他使用者看過的電影推薦給使用者A。那麼現在的問題就是,我們該如何計算兩個電影之間的相似度以及兩個使用者之間的相似度呢?其實每個電影或者每個使用者我們都可以用向量來表示。我們可以將向量想象成為高維空間中的點,兩個點之間的距離越近那麼這兩個點越相似。所以我們可以通過計算點與點之間的距離,來度量兩個點之間的相似性,更具體來說就是度量兩個例項之間的相似性。

    A.基於item的協同過濾    

    在這種協同過濾中,我們先計算商品(電影)之間的相似度,然後根據商品的相似度來向用戶推薦。我們通常使用以下公式來度量商品之間的相似度。

計算完商品的相似度之後,我們就可以使用以下公式預測使用者對商品的評分了。


這個公式想要表達的意思是:根據使用者對與商品i相似商品的評分來推斷使用者對商品i的評分。當我們求出使用者對所有商品的預測評分之後,將其進行排序,選擇得分最高的商品推薦給使用者。

    B.基於使用者的協同過濾

    在這種協同過濾中,我們先計算使用者之間的相似度,然後根據其他使用者購買過的商品推薦給該使用者。我們通常使用以下公式來度量使用者之間的相似度。


計算完使用者的相似度之後,我們就可以使用以下公式預測使用者對商品的評分了。


這個公式想表達的意思是:根據與使用者u相似的其他使用者v對商品i的評分,來預測該使用者對商品i的評分。當我們求出該使用者對所有商品預測評分之後,選擇得分最高的那幾個商品推薦給該使用者。

2.推薦系統的評估

通常情況下一個推薦系統從開發到投入商業使用要同時結合線下評估和線上評估。

1)線下評估

A.線下評估的方法--均方跟誤差RMSERoot Mean Square Error


比如我們將資料集劃分為訓練集和測試集,使用訓練集資料訓練推薦系統,訓練完成之後我們將推薦系統在測試集上進行測試。假設推薦系統對使用者A對商品I的評分進行預測,預測結果為3分,實際是4分,此時的誤差就是-1。對測試集中的資料都執行這樣的運算,在計算誤差的平方和,計算平均值,最後計算 算術平法根。RMSE的值越小,表示推薦系統的效能越好。

B.線下評估的方法--絕對平均誤差MAEmean absolute error


MAE的計算公式如上所示,可以看出相比RMSEMAE對誤差較大的預測懲罰較小,計算開銷沒有RMSE大,因為該方法不涉及乘方操作。

C.線下評估的方法--recall+precision

不管是RMSE還是MAE,都要求擁有使用者對商品的評分資訊。當然有些使用者是很懶的,他們並不會去評價商品,這個時候就沒有評分資訊。所以當評分資訊不多的時候使用RMSE或者MAE對推薦系統的效能進行評估就不太合適了。更多的時候我們擁有的資訊是使用者有沒有看過這個商品或者有沒有購買這個商品,這種情況下我們可以使用--recall+precision

假如A購買了10個商品,現在我們將購買的商品隱藏,使用推薦系統向A使用者推薦商品。假如推薦系統的推薦的50個商品中,有6個是使用者買的。那麼recall = 6/10precision= 6/50。具體的計算公式如下:


通常我們結合precisionrecall這兩個的值可以得到F scoreF的值越大就說明這個推薦系統的效能越好,F值的求解公式如下所示:


2)線上評估

A.線上評估的方法--A/B testing


我們可以使用A/B testing這種方式對多個推薦系統進行線上評估。假設我們構建了3個推薦系統的模型,這些推薦系統性能線上下測試的時候效能相當,現在進行線上測試。我們將使用者分成不同的組,不同分組的使用者使用不同的推薦系統進行推薦。最後看看哪個分組的推薦系統性能較好,這就是A/B testing。

B.線上評估--CTR(Click Through Rate)CR(Conversion Rate)

假設推薦系統向用戶A重複推送一系列相同的商品10次,使用者A3次點選了其中的商品。那麼推薦系統的CTR=3/10CTR越高說明使用者對這個商品越感興趣。當用戶點選進去之後,使用者是否看完了這部電影,看完了這篇文章,購買了這部商品。也就是說,使用者不但點選了連結,而且好好體驗了商品,這就是CRCR(轉化率)越高,使用者的體驗越好,自然你的推薦系統的效能就是越好的。

C.線上評估--ROIQA


在推薦系統中ROI越大,說明推薦系統的效能越好。有時候憑藉演算法來衡量推薦系統的效能總會出現一些奇怪的地方,所以最好成立一個QA小組,來測試推薦系統,根據個人的經驗來評判推薦系統的好壞。

推薦系統從構建到投入使用,要經過一系列的評估。評估分為兩個階段,首先是線下評估,我們快速構建多個合適的推薦系統,然後制定評估推薦系統的標準,以進行線下評估。線下評估結束後,將選擇得到的模型進行線上評估。我使用A/B testing的方式來評估推薦系統,評估方式可以結合CTR+CRROI+QA來進行綜合評估,最後得到可靠的推薦系統。

以上就是自己對推薦系統的一些拙見,歡迎大家指點和吐槽!