天天看點

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

在上一篇,我們已經講解了推薦算法存在的意義和原理,并且也提到了基于内容的推薦算法,這是一種在諸多APP裡常用的一種算法,今天我們來嘗試着推另外一個常用的算法,也就是CF算法,協同過濾。

  1. 協同過濾的原理

用一句話簡單的話來概述協同過濾算法,那就是利用使用者的曆史喜好資訊計算使用者之間的距離,然後結合與該使用者相似的其他使用者對該商品的評價,來預測目标使用者對特定商品的喜好程度,進而根據這一喜好程度來對目标使用者進行推薦,這裡的喜好程度也可以間接的轉換成該目标使用者對這件商品的評分,自然分越高,代表越喜歡。 協同過濾分為兩種,一種是啟發式的一種是模型式的,而我們今天重點研究啟發式的。

  1.1 基于使用者的協同過濾(user-based collaboratIve filtering)   

既然基于使用者,則肯定是以使用者為主,是以基于使用者的協同過濾也就是挖掘使用者的曆史行為資訊,并尋找與目标使用者相似的其他使用者,最後根據這些相似使用者對其他産品的評價資訊預測目前目标使用者可能喜歡的産品。簡單來說就是如同網易雲的每日推薦歌單,我猜測其原理也就是尋找與自己相似的使用者,在大家的歌單中尋找相似的歌曲并且進行打分預測,如果評分較高就推薦給目标使用者。 是以我們要學習基于使用者的協同過濾,首先我們要做的就是找到與目标使用者相似的其他使用者,這裡又出現了“相似”這個詞,我們怎麼去定義這個相似呢?

1.1.1 使用者與使用者間的相似度

  • 餘弦相似度

在上一章的時候,我們也提到了餘弦相似度,那麼這一次我們來細緻的了解下什麼是餘弦相似度。當我們在比較兩個樣本相似度是否很高的時候,我們将其轉化為兩個n維的向量(n維就代表有n個特征),然後我們來計算這兩個向量所形成的夾角的餘弦值,如果這兩個觀測相似度越高,說明這兩個向量的夾角就應該越小(因為兩個點越接近重合,則對應的夾角就越小),相應的餘弦值就越大,當然,最大就為1。

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

如圖所示,我們先從最簡單的二維向量說起,也就是AB兩點代表了他們隻有兩個特征,如果這兩個特征所對應的XY值都很接近,那麼AB兩點就會很接近,對應的夾角就會很小,是以餘弦值就變大。具體公式如下:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

公式的原理很簡單,就是兩個向量的點乘除以其兩個向量2-範數的乘積,其實2-範數就是這個向量的模長。ru,i和rv,i分别代表使用者u和v對商品i的評分,這裡的i代表無論這兩個使用者是否有評測也加入計算當中(當沒有評測就以0來代替)。

  • 皮爾遜相關系數

皮爾遜相關系數和之前的餘弦相似度的作用是一緻的,皮爾遜相關系數的範圍是在[-1, 1]之間,絕對值越大,代表相關性越大,當然如果是負的,就代表負相關,如果是正的,就代表正相關,具體的計算公式如下:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

其中Iu與Iv的交集代表兩個使用者所共有的對商品的評價項集,rui和rvi代表u和v使用者對産品i的評價,run與rvn代表使用者u與v的共同點評的商品的平均評分,當然這裡需要提一提的便是這個商品i自然是這兩個使用者共有的有評測的第i個商品。

  • 歐幾裡得距離

其實歐幾裡得距離和之前我們提到的餘弦相似度有那麼一點點的像,之前我們是看夾角的大小,如果兩個點靠得越近,那麼夾角自然就越小,那麼相似度就越大。關于歐幾裡得距離也有些許相似,如果兩個點的距離越小,即隔得越近,代表相似度越高,是以我們用以下的公式來表示:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

在公式中,之是以分母加了1,是為了防止兩個完全重複的點,也就是如果這兩個使用者的評價都驚人的一緻,則歐幾裡得距離就為0,即分母就為0了,同時如果歐幾裡得值接近于0的時候,相似度就已經趨向于一個很大的數,不友善我們計算比較。從這個公式我們也可以發現,歐幾裡得距離越趨向于0,則越相似,相似度也就越大,越接近于1。

  • 修正餘弦相似度

為什麼這裡我們需要修正呢?是因為此相似度相對于餘弦相似度和歐幾裡得相似度,精度會更好,因為像餘弦相似度,沒有減掉均值,對于使用者A可能3分以上就算優等,但是對于使用者B可能4分以上才是優等,是以如果使用修正餘弦相似度就可以避免個人因素的評分,修正餘弦相似度就是在原來的基礎上減去使用者的所有商品的評分均值。同時,和餘弦相似度不一樣的點就是其看待的是所有共同點評過的商品,均值是所有該使用者點評的商品的評分均值,具體公式如下:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

1.1.2 未評分商品的分值預測

在上一步中我們找到了許多與目标使用者相似的其他使用者,而這些使用者中,比如我們想要判斷目标使用者是否對某個商品有興趣,那首先這個使用者肯定對這個商品沒有評分,此時就要在資料集中找到對這個商品有評分的其他使用者,所組成一個集合我們稱之為鄰居集,就像你在考慮是否在家裡買個家電,然後就看看隔壁幾家的這個家電如何,看看他們與自己的購物風格是否相似,然後考慮自己是否去買這台家電。是以,根據以下的公式我們來預測評分:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

這樣我們就得到了預測分值了,當然肯定預測的分值越大就代表該目标使用者可能就越喜歡。順帶一提,公式中的N代表的就是我們上面所提到的鄰居集。

1.1.3 應用執行個體

是以筆者推測,我們可以這樣來做基于使用者的協同過濾,計算使用者與目标使用者相似度,将相似度較大的再分在一起,這樣就先縮小了一大步資料集,接着我們再在其中去尋找鄰居集,預測目标使用者對其他商品的評分,将評分較高的進行推薦。 那具體的實作,我們就以下面這個例子為例:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

現在我們的任務就是想看看B使用者對商品1的評分。 我們可以發現對于B使用者,他的鄰居集有四個,因為ACDE都對商品1打過分。是以我們分别來計算ACDE與使用者B的相似度(這裡我們隻用修正餘弦相似度來示範):

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

接着我們就利用這個相似度就可以預測表格中B使用者對于商品1的分值了:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

當然其他的問号處的計算方法與此類似,這裡就不詳細的叙述了。

  1.2 基于項目的協同過濾   

基于項目的協同過濾,或者叫做基于物品的協同過濾,也是一種常見的算法,與基于使用者的不一樣,這個算法是圍繞物品之間的相似度展開的。通過物品的相似度來預測使用者對該商品的評分,這裡仍然可以使用我們之前所提到餘弦相似度和皮爾遜相關系數,但是這裡我們再來研究其他的計算方法吧,具體的流程我們一起來看看。

1.2.1 商品間的相似度

那麼關于物品相似度我們可以這麼來了解,如果有很多個喜歡i商品的都還喜歡j商品,那i與j的相似度就可能比較高,具體公式如下:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

其中分母表示喜歡i這個商品的使用者數,分子表示既喜歡商品i又喜歡商品j的使用者數。 但是這個公式有一個問題,商品j如果是一個超級熱門的商品會怎麼樣?這意味着基本上每一位使用者都可能含有這件商品,此時s(i,j)就接近于1,但是這并不能代表商品j與商品i就相似了,是以我們要将這個公式給稍加更改成如下的形式:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

這樣的變形,就算是熱門的商品,也不一定能夠讓其相似度達到1,因為分母有一個懲罰項。

1.2.2 對商品的預測評分

接下來我們仍然和之前一樣,結合該使用者的其他相似商品的評分,預測未知評分,公式如下:

協同過濾推薦算法_Day8推薦算法之協同過濾(Collaborative Filtering Recommendation)

其中S表示和i商品相似的項集,s(i, j)表示i與j之間的相似度,ruj表示使用者u對j的評分。

繼續閱讀