1. 程式人生 > >推薦系統-利用使用者行為資料

推薦系統-利用使用者行為資料

使用者的行為資料介紹:      使用者的行為主要分為兩種-顯性反饋行為 和 隱性反饋行為 ,顯性反饋行為主要包括 評分 和喜歡/不喜歡 ,youtube最早是使用是使用五分評價系統的,但是隻有使用者很不滿意和特別滿意的情況下才會評分,因此又把它變成了二級評分系統。 隱式反饋行為就是頁面的瀏覽行為。 使用者的行為分析:     使用者的資料分佈大都滿足一種長尾分佈,就是 每個單詞出現的頻率和他在熱門排行榜的排名成反比。反映在網路行為上就是越是新使用者越傾向於選擇熱門的產品越是老使用者越是傾向於冷門產品 。 基於使用者的行為的推薦演算法就是協同過濾演算法,包括 基於鄰域的演算法 , 隱語義模型 基於圖的隨機遊走演算法 ,而基於鄰域的演算法包括 基於使用者的,和基於物品的     我們在評測演算法的時候往往使用 準確率 召回率 覆蓋率(最終的推薦列表中包含多大比例的物品,如果所有物品都至少被推薦給了一個使用者,那麼覆蓋率就是100%)流行度(流行度越高推薦物品的新穎度越小) 基於鄰域的演算法:
基於使用者的協同過濾 (1) 找到和目標使用者興趣相似的使用者集合、 (2) 找到這個集合中使用者喜歡的 且目標使用者沒見過的推薦給目標使用者 計算公式(jaccard): 餘弦相似度: 其中N(u)是u使用者感興趣的物品們; 但是這樣就會導致我們計算大量的為空時候,我們還需要計算分母,導致計算資源的浪費。 所以我們建立物品到使用者的倒排表,可以掃描每個物品欄對應的所有使用者,每兩對使用者對應的C[u][v]加1,C為我們的使用者和使用者的關係矩陣 改進:兩個user對熱門的物品的行為相似並不能說明兩個人的興趣的相似性,只有對冷門的物品採用相同的態度才能證明兩個人的興趣相似,因此我們給每個物品加上一個權重既 流行度的倒數 越是冷門的物品的權重越大,N(i)為喜歡第i個物品的人

基於物品的協同過濾: 基於物品的協同過濾是目前用處最多的演算法,比如amazon youtube,他可以利用使用者的歷史行為給推薦系統的結果提供解釋。 (1)計算物品之間的相似度 (2)根據物品的相似度和使用者的歷史行為給使用者生成推薦列表 相似度:和上述方法類似為了避免過多的浪費計算資源,我們先建立使用者-物品的倒排表。我們就可以得到一個物品-物品之間的關係表。同樣為了避免那些很活躍的使用者對關係表的干擾(他們可能會讓所有關係表的位置都加1)因此對他們的貢獻加以限制
比較:usercf常常用於新聞的推薦,itemcf常常用於購物網站視訊的推薦 usercf的推薦結果看重與反映和使用者興趣相似的小群體的熱點,更社會化。比較粗粒度,所以特別適合想新聞這種沒有細粒度的個性存在的領域,並且新聞的更新非常快就是item比較多,維護一張user-user的關係表比維護一張item-item的表更加easy,熱門性和實效性才是個性化新聞推薦的熱點 而itemcf演算法更加重視細粒度的個性,維繫使用者的歷史興趣,幫助使用者發現和他領域相關的物品,所以圖書,電子商務,電影網站更加傾向於itemcf,這樣需要維繫一張item-item的表格,物品相似度比較穩定,新使用者只要對一個物品產生行為,就可以推薦給他相關的物品。 隱語義模型(lfm):
之前的方法是使用統計的方法,隱語義模型主要是用優化的手段,首先找到使用者的興趣分類,然後從分類中挑選他喜歡的物品,lfm通過以下方式計算使用者u對物品i的興趣
p度量了使用者u對隱分類k的關係,q度量了i物品和隱分類k的關係,由於是要機器學習的,所以我們可以隨機取樣得到負樣本,既使用者沒有產生互動的資料,最終優化的式子為:
 採用最簡單的梯度下降法來解,K為我們的訓練集。 lfm模型是不能因為使用者行為的實時變化來調整結果的,為了解決這一問題我們將r增加一部分,
此處 x是u使用者的歷史興趣,根據使用者的歷史獲得,y就是該物品的內容屬性。這樣在新聞剛剛出現的時候就可以確定新聞的該向誰推薦 比較lfm與基於鄰域的推薦: 基於鄰域的方法是需要離線維護一張相關表,如果使用者或者物品很多會暫居很大空間 O(N*N) 但是在lfm中假設有f個隱類 則空間為O(F(N+M)), 當用戶一旦有新的動向的時候,itemcf就可以實時更新推薦給使用者的列表,但是lfm則需要計算使用者對所有物品的興趣權重,然後進行排名的,因此比較適合物品數目較少的系統。 基於圖的模型, 可以利用隨機遊走的方法,得到使用者對物體的排名,但是此方法時間複雜度很高,需要多次迭代才能收斂。 附:(svd分解在推薦系統的應用)

其實說參考也不準確,準確地說應該是半翻譯半學習筆記。

仔細整理一遍,感覺還是收穫很大的。

線性代數相關知識:

任意一個M*N的矩陣A(M行*N列M>N),可以被寫成三個矩陣的乘積:

1. U:(M行M列的列正交矩陣)

2. S:(M*N的對角線矩陣,矩陣元素非負)

3. V:(N*N的正交矩陣的倒置)

即 A=U*S*V'(注意矩陣V需要倒置)

直觀地說:

假設我們有一個矩陣,該矩陣每一列代表一個user,每一行代表一個item。

svd-recsys

如上圖,ben,tom….代表user,season n代表item。

矩陣值代表評分(0代表未評分):

如 ben對season1評分為5,tom對season1 評分為5,tom對season2未評分。

機器學習和資訊檢索:

機器學習的一個最根本也是最有趣的特性是資料壓縮概念的相關性。

如果我們能夠從資料中抽取某些有意義的感念,則我們能用更少的位元位來表述這個資料。

從資訊理論的角度則是資料之間存在相關性,則有可壓縮性。

SVD就是用來將一個大的矩陣以降低維數的方式進行有損地壓縮。

降維:

下面我們將用一個具體的例子展示svd的具體過程。

首先是A矩陣。

A =

     5     5     0     5
     5     0     3     4
     3     4     0     3
     0     0     5     3
     5     4     4     5
     5     4     5     5

(代表上圖的評分矩陣)

使用matlab呼叫svd函式:

[U,S,Vtranspose]=svd(A)

U =
   -0.4472   -0.5373   -0.0064   -0.5037   -0.3857   -0.3298
   -0.3586    0.2461    0.8622   -0.1458    0.0780    0.2002
   -0.2925   -0.4033   -0.2275   -0.1038    0.4360    0.7065
   -0.2078    0.6700   -0.3951   -0.5888    0.0260    0.0667
   -0.5099    0.0597   -0.1097    0.2869    0.5946   -0.5371
   -0.5316    0.1887   -0.1914    0.5341   -0.5485    0.2429

S =
   17.7139         0         0         0
         0    6.3917         0         0
         0         0    3.0980         0
         0         0         0    1.3290
         0         0         0         0
         0         0         0         0

Vtranspose =
   -0.5710   -0.2228    0.6749    0.4109
   -0.4275   -0.5172   -0.6929    0.2637
   -0.3846    0.8246   -0.2532    0.3286
   -0.5859    0.0532    0.0140   -0.8085

分解矩陣之後我們首先需要明白S的意義。

可以看到S很特別,是個對角線矩陣。

每個元素非負,而且依次減小,具體要講明白元素值的意思大概和線性代數的特徵向量,特徵值有關。

但是可以大致理解如下:

線上性空間裡,每個向量代表一個方向。

所以特徵值是代表該矩陣向著該特徵值對應的特徵向量的方向的變化權重。

所以可以取S對角線上前k個元素。

當k=2時候即將S(6*4)降維成S(2*2)

同時U(6*6),Vtranspose(4*4)相應地變為 U(6*2),Vtranspose(4*2).

如下圖(圖片裡的usv矩陣元素值和我自己matlab算出的usv矩陣元素值有些正負不一致,但是本質是相同的):

svd-recsys

此時我們用降維後的U,S,V來相乘得到A2

A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))' //matlab語句
A2 =

    5.2885    5.1627    0.2149    4.4591
    3.2768    1.9021    3.7400    3.8058
    3.5324    3.5479   -0.1332    2.8984
    1.1475   -0.6417    4.9472    2.3846
    5.0727    3.6640    3.7887    5.3130
    5.1086    3.4019    4.6166    5.5822

此時我們可以很直觀地看出,A2和A很接近,這就是之前說的降維可以看成一種資料的有失真壓縮。

接下來我們開始分析該矩陣中資料的相關性。

我們將u的第一列當成x值,第二列當成y值。即u的每一行用一個二維向量表示,同理v的每一行也用一個二維向量表示。

如下圖:

svd-recsys

從圖中可以看出:

Season5,Season6特別靠近。Ben和Fred也特別靠近。

同時我們仔細看一下A矩陣可以發現,A矩陣的第5行向量和第6行向量特別相似,Ben所在的列向量和Fred所在的列向量也特別相似。

所以從直觀上我們發現U矩陣和V矩陣可以近似來代表A矩陣,換據話說就是將A矩陣壓縮成U矩陣和V矩陣,至於壓縮比例得看當時對S矩陣取前k個數的k值是多少。

到這裡,我們已經完成了一半。

尋找相似使用者:

依然用例項來說明:

我們假設,現在有個名字叫Bob的新使用者,並且已知這個使用者對season n的評分向量為:[5 5 0 0 0 5]。(此向量為列向量)

我們的任務是要對他做出個性化的推薦。

我們的思路首先是利用新使用者的評分向量找出該使用者的相似使用者。

svd-recsys

如上圖(圖中第二行式子有錯誤,Bob的轉置應為行向量)。

對圖中公式不做證明,只需要知道結論,結論是得到一個Bob的二維向量,即知道Bob的座標。

將Bob座標新增進原來的圖中:

svd-recsys

然後從圖中找出和Bob最相似的使用者。

注意,最相似並不是距離最近的使用者,這裡的相似用餘弦相似度計算。(關於相似度還有很多種計算方法,各有優缺點)

即夾角與Bob最小的使用者座標。

可以計算出最相似的使用者是ben。

接下來的推薦策略就完全取決於個人選擇了。

這裡介紹一個非常簡單的推薦策略:

找出最相似的使用者,即ben。

觀察ben的評分向量為:【5 5 3 0 5 5】。

對比Bob的評分向量:【5 5 0 0 0 5】。

然後找出ben評分過而Bob未評分的item並排序,即【season 5:5,season 3:3】。

即推薦給Bob的item依次為 season5 和 season3。

最後還有一些關於整個推薦思路的可改進的地方:

1.

svd本身就是時間複雜度高的計算過程,如果資料量大的情況恐怕時間消耗無法忍受。 不過可以使用梯度下降等機器學習的相關方法來進行近似計算,以減少時間消耗。

2.

相似度計算方法的選擇,有多種相似度計算方法,每種都有對應優缺點,對針對不同場景使用最適合的相似度計算方法。

3.

推薦策略:首先是相似使用者可以多個,每個由相似度作為權重來共同影響推薦的item的評分。