① Neo4j 做推薦 (10)—— 協同過濾(皮爾遜相似性)
皮爾遜相似性或皮爾遜相關性是我們可以使用的另一種相似度量。這特別適合產品推薦,因為它考慮到 不同用戶將具有不同的平均評分 這一事實:平均而言,一些用戶傾向於給出比其他用戶更高的評分。由於皮爾遜相似性考慮了 均值的差異 ,因此該指標將解釋這些差異。
根據皮爾遜的相似度,找到與Cynthia Freeman最相似的用戶
MATCH (u1:User {name:"Cynthia Freeman"})-[r:RATED]->(m:Movie)
WITH u1, avg(r.rating) AS u1_mean
MATCH (u1)-[r1:RATED]->(m:Movie)<-[r2:RATED]-(u2)
WITH u1, u1_mean, u2, COLLECT({r1: r1, r2: r2}) AS ratings WHERE size(ratings) > 10
MATCH (u2)-[r:RATED]->(m:Movie)
WITH u1, u1_mean, u2, avg(r.rating) AS u2_mean, ratings
UNWIND ratings AS r
WITH sum( (r.r1.rating-u1_mean) * (r.r2.rating-u2_mean) ) AS nom,
sqrt( sum( (r.r1.rating - u1_mean)^2) * sum( (r.r2.rating - u2_mean) ^2)) AS denom,
u1, u2 WHERE denom <> 0
RETURN u1.name, u2.name, nom/denom AS pearson
ORDER BY pearson DESC LIMIT 100
Neo4j 做推薦 (1)—— 基礎數據
Neo4j 做推薦 (2)—— 基於內容的過濾
Neo4j 做推薦 (3)—— 協同過濾
Neo4j 做推薦 (4)—— 基於內容的過濾(續)
Neo4j 做推薦 (5)—— 基於類型的個性化建議
Neo4j 做推薦 (6)—— 加權內容演算法
Neo4j 做推薦 (7)—— 基於內容的相似度量標准
Neo4j 做推薦 (8)—— 協同過濾(利用電影評級)
Neo4j 做推薦 (9)—— 協同過濾(人群的智慧)
Neo4j 做推薦 (10)—— 協同過濾(皮爾遜相似性)
Neo4j 做推薦 (11)—— 協同過濾(餘弦相似度)
Neo4j 做推薦 (12)—— 協同過濾(基於鄰域的推薦)
② 協同過濾,基於內容推薦有什麼區別
舉個簡單的小例子,我們已知道
用戶u1喜歡的電影是A,B,C
用戶u2喜歡的電影是A, C, E, F
用戶u3喜歡的電影是B,D
我們需要解決的問題是:決定對u1是不是應該推薦F這部電影
基於內容的做法:要分析F的特徵和u1所喜歡的A、B、C的特徵,需要知道的信息是A(戰爭片),B(戰爭片),C(劇情片),如果F(戰爭片),那麼F很大程度上可以推薦給u1,這是基於內容的做法,你需要對item進行特徵建立和建模。
協同過濾的辦法:那麼你完全可以忽略item的建模,因為這種辦法的決策是依賴user和item之間的關系,也就是這里的用戶和電影之間的關系。我們不再需要知道ABCF哪些是戰爭片,哪些是劇情片,我們只需要知道用戶u1和u2按照item向量表示,他們的相似度比較高,那麼我們可以把u2所喜歡的F這部影片推薦給u1。
根據數據源的不同推薦引擎可以分為三類
1、基於人口的統計學推薦(Demographic-based Recommendation)
2、基於內容的推薦(Content-based Recommendation)
3、基於協同過濾的推薦(Collaborative Filtering-based Recommendation)
基於內容的推薦:
根據物品或內容的元數據,發現物品或內容的相關性,然後基於用戶以前的喜好記錄推薦給用戶相似的物品
基於內容推薦的一個典型的例子,電影推薦系統,首先我們需要對電影的元數據有一個建模,這里只簡單的描述了一下電影的類型;然後通過電影的元數據發現電影間的相似度,因為類型都是「愛情,浪漫」電影 A 和 C 被認為是相似的電影(當然,只根據類型是不夠的,要得到更好的推薦,我們還可以考慮電影的導演,演員等等);最後實現推薦,對於用戶 A,他喜歡看電影 A,那麼系統就可以給他推薦類似的電影 C。
③ 利用 SVD 實現協同過濾推薦演算法
奇異值分解(Singular Value Decomposition,以下簡稱SVD)
是在機器學習領域廣泛應用的演算法,它不光可以用於 降維演算法中的特徵分解 ,還可以用於 推薦系統 ,以及自然語言處理等領域。
優點: 簡化數據,去除雜訊,提高演算法的結果。
缺點: 數據的轉換可能難以理解。
應用領域: 推薦引擎(協同過濾、相似度計算)、圖像壓縮等。
SVD定義: 如果我們求出了矩陣A的n個特徵值λ1≤λ2≤...≤λn,以及這n個特徵值所對應的特徵向量{w1,w2,...wn},如果這n個特徵向量線性無關,那麼矩陣A就可以用下式的特徵分解表示:A=WΣW−1,其中W是這n個特徵向量所張成的n×n維矩陣,而Σ為這n個特徵值為主對角線的n×n維矩陣。一般我們會把W的這n個特徵向量標准化,即滿足||wi||2=1, 或者wiTwi=1,此時W的n個特徵向量為標准正交基,滿WTW=I,即WT=W−1, 也就是說W為酉矩陣。要進行特徵分解,矩陣A必須為方陣。那麼如果A不是方陣,則用到SVD。
矩陣A的SVD為:A=UΣVT,其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足UTU=I,VTV=I。
對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。
因此SVD 也是一種強大的降維工具 ,可以利用 SVD 來逼近矩陣並從中獲得主要的特徵。通過保留矩陣的 80%~90% 的能量,就可以得到重用的特徵並去除雜訊。
推薦系統 是利用電子商務網站向客戶提供商品信息和建議,幫助用戶決定應該購買什麼產品,模擬銷售人員幫助客戶完成購買過程。
主要有以下幾種推薦演算法:
基於內容的推薦(用到自然語言處理), 協同過濾(主流) ,基於規則推薦(基於最多用戶點擊,最多用戶瀏覽等),混合推薦(類似集成演算法,投票決定),基於人口統計信息的推薦(根據用戶基本信息)
協同過濾推薦分為三種類型。 第一種是基於用戶(user-based)的協余態橡同過濾(需要在線找用戶和用戶之間的閉攔相似度關系),第二種是基於項目(item-based)的協同過濾(基於項目的協同過濾可以離線找物品和物品之間的相似度關系), 第三種是基於模型(model based)的協同過濾(用戶和物品,主流)。
一般在推薦系統中,數據往往是使用 用戶-物品 矩陣來表示的。 用戶對其接觸過的物品進行評分,評分表示了用戶對於物品的喜愛程度,分數越高,表示用戶越喜歡這個物品。而這個矩陣往往是稀疏的,空白項是用戶還未接觸到的物品,推薦系統的任務則是選擇其中的部分物品推薦給用戶。
對於這個 用戶-物品 矩陣,用已有的部分稀疏數據來預測那些空白的物品和數據之間的評分關系,找到最高評分的物品推薦給用戶。
具體基於模型的方法有:
用關聯演算法做協同過濾(Apriori演算法、FP Tree演算法)
用聚類演算法做協同過濾(針對基於用戶或者基於模型,Kmeans,DBSCAN)
用分類演算法做協同過濾(設定評分閾值,高於推薦,低於不推薦,邏輯回歸和樸素貝葉斯,解釋性很強)
用回歸演算法做協同過濾(Ridge回歸,回歸樹)
用矩陣分解做協同過濾(由於傳統的奇異值分解SVD要求矩陣不能有缺失數據,必須是稠密的,而用戶物品評分矩陣是一個典型的稀疏矩陣,主要是SVD的一些變種,比如FunkSVD,BiasSVD和SVD++。這些演算法和傳統SVD的最大區別是不再要求將矩陣分解為UΣVT的形式,而變是兩個低秩矩陣PTQ的乘積形式。)
用神經網豎旁絡做協同過濾(限制玻爾茲曼機RBM)
在 Python 的 numpy 中,linalg已經實現了SVD
④ 推薦系統論文閱讀(二十三)-神經圖協同過濾NGCF
論文:
論文題目:《Neural Graph Collaborative Filtering》
論文地址: https://arxiv.org/pdf/1905.08108.pdf
本論文是關於圖結構的協同過濾演算法,在原始的矩陣分解和基於深度學習的方法中,通常是通過映射描述用戶(或物品)的現有特徵(例如ID和屬性)來獲得用戶(或物品)的嵌入。從而利用user和item的embedding進行協同召回。但是作者認為這種方法的固有缺點是:在user與item的interaction數據中潛伏的 協作信號(collaborative signal) 未在嵌入過程中進行編碼。這樣,所得的嵌入可能不足以捕獲協同過濾效果。
讓我們一起來看一下本論文是怎麼利用數據中潛伏的協作信號的吧。
推薦演算法被廣泛的運用在各個領域中,在電商領域,社交媒體,廣告等領域都發揮著至關重要的作用。推薦系統的核心內容就是根據用戶以前的購買和點擊行為來評估用戶對一個物品的喜愛程度,從而針對每個用戶進行個性化推薦。協同過濾演算法認為歷史行為相似的用戶之間的興趣是相同的,所以給用戶推薦的是同類型用戶的愛好,也就是UserCF,而ItemCF給用戶推薦的是跟歷史行為相近的物品。
傳統的協同過濾方法要麼是基於矩陣分解,要麼是基於深度學習的,這兩種方法都忽略了一個非常關鍵的信息---user和item交互的協作信號,該信號隱藏在user和item的交互過程中。原始的協同過毀昌濾方法忽略了這種信息,所以在進行user 和 item representation時就不足以較好的進行embedding。
本論文通過將用戶項交互(更具體地說是二分圖結構)集成到embedding過程中,開發了一個新的推薦框架神經圖協同過濾(NGCF),該框架通過在其上傳播embedding來利用user-item圖結構。這種方法在用戶項目圖中進行高階連通性的表達建模,從而以顯式方式將協作信號有效地注入到embedding過程中。
在介紹模型之前先來講解一下什麼是useritem interaction以及什麼是高階的useritem interaction。
我們先看左顫余塵邊的圖,這個圖就是useritem interaction,u1是我們待推薦的用戶,用雙圓圈表示,他交互過的物品有i1,i2,i3。在看右邊這個樹形結構的圖,這個圖是u1的高階interaction圖,注意只有l > 1的才是u1的高階連接。觀察到,這么一條路徑,u1 ← i2 ← u2,指示u1和u2之間的行為相似性,因為兩個用戶都已與i2進行了交互。而另一條更長的路徑,u1←i2←u2←i4暗示u1可能會點擊i4,因為他的相似用戶u2之前已經購買過i4。另一方面,用戶u1在l = 3這一層會更傾向於i4而不是i5,理由是i4到u1有兩條路徑而i5隻有一條。
當然這種樹結構是不可能通過構建真正的樹節點來表示的,因為樹模型比較復雜,而且結構很大,沒法對每個用戶構建一個樹,茄禪這樣工作量太大了。那麼怎麼設計模型結構可以達到跟這個high-order connectivity的效果呢,這個就要運用到神經網路了。通過設計一個embedding propagation layer來表示這種embedding 在每個層之間的傳遞。
還是拿上面那張圖舉例子,堆疊兩層可捕獲u1←i2←u2的行為相似性,堆疊三層可捕獲u1←i2←u2←i4的潛在推薦以及信息流的強度(由層之間的可訓練權重來評估),並確定i4和i5的推薦優先順序。
這個跟傳統的embedding是一樣的,都是對原始的userID和itemID做embedding,跟傳統embedding不同的地方是,在我們的NGCF框架中,我們通過在用戶-項目交互圖上傳播embedding來優化embedding。 由於embedding優化步驟將協作信號顯式注入到embedding中,因此可以為推薦提供更有效的embedding。
這一層是本文的核心內容,下面我們來進行詳細的解讀。
從直觀上來看,用戶交互過的item會給用戶的偏好帶來最直接的依據。類似地,交互過某個item的用戶可以視為該item的特徵,並可以用來衡量兩個item的協同相似性。 我們以此為基礎在連接的用戶和項目之間執行embedding propogation,並通過兩個主要操作來制定流程:消息構建和消息聚合。
Message Construction(消息構建)
對於連接的user-item對(u,i),我們定義從i到u的消息為:
其中ei是i的embedding,eu是u的embedding,pui是用於控制每次傳播的衰減因子,函數f是消息構建函數,f的定義為:
其中W1和W2用來提取有用的embedding信息,可以看到W2控制的i和u直接的交互性,這使得消息取決於ei和eu之間的親和力,比如,傳遞更多來自相似項的消息。
另一個重要的地方是Nu和Ni,pui = 1/ 。Nu和Ni表示用戶u和item i的第一跳鄰居。 從表示學習的角度來看,pui反映了歷史item對用戶偏好的貢獻程度。 從消息傳遞的角度來看,考慮到正在傳播的消息應隨路徑長度衰減,因此pui可以解釋為折扣因子。
Message Aggregation
聚合方法如下 :
其中 表示在第一嵌入傳播層之後獲得的用戶u的表示。激活函數採用的是leakyrelu,這個函數適合對pos和neg信號進行編碼。
另一個重要的信息是 ,它的定義如下:
這個信息的主要作用是保留原始的特徵信息。
至此,我們得到了 ,同樣的方法,我們也能獲得 ,這個都是first order connectivoty的信息。
根據前面的計算方式,我們如果將多個Embedding Propagation Layers進行堆疊,我們就可以得到high order connectivity信息了:
計算方式如下:
當我看到這里的時候,我的腦子里產生了一個大大的疑惑,我們在計算第l層的eu和ei時都需要第l-1層的信息,那麼我們怎麼知道ei和eu在第l層是否存在呢?也就是說出現u側的總層數l大於i側總層數的時候,我們如何根據第l-1層的ei來計算第l層的e呢?經過思考,我感覺應該是這樣的,訓練樣本應該是一條path,也就是這個例子是u1 ← i2 ← u2 ← i4這條path,所以可以保證u1跟i4的層數l是一樣的,所以不存在上面那個層數不匹配的問題。
ps:看到後面的實驗結果才知道L是固定的所以每一層都不會缺失。
還有一個就是,不同層之間的W是不一樣的,每一層都有著自己的參數,這個看公式就知道,理由就是我們在提取不同層信息的時候需要不同的W進行信息提取。
另一個疑惑是pui到底是不是每一個l層都一樣?這里看公式好像就是指的是第一跳的Nu和Ni進行就計算的結果。
這部分內容是為了在進行batch訓練的時候進行矩陣運算所推導的數學過程,其實跟之前我們講的那個過程在數學上的計算是完全一樣的,你想像一下,如果不用矩陣進行運算,在訓練過程中要如何進行這么復雜的交互運算。
當進行了l層的embedding propagation後,我們就擁有了l個eu和l個ei,我們將他們進行concate操作:
這樣,我們不僅可以通過嵌入傳播層豐富初始嵌入,還可以通過調整L來控制傳播范圍。
最後,我們進行內積計算,以評估用戶對目標商品的偏好:
採用的是pair-wise方式中的bpr loss:
⑤ 基於協同過濾的推薦演算法
協同過濾推薦演算法是最經典的推薦演算法,它的演算法思想為 物以類聚,人以群分 ,基本的協鍵困同過濾演算法基於以下的假設:
實現協同過濾的步驟:
1). 找到相似的Top-N個人或者物品 :計算兩兩的相似度並進行排序
2). 根據相似的人或物品產生推薦結果 :利用Top-N生成初始推薦結果,然後悔毀過濾掉用戶已經有過記錄或者明確表示不喜歡的物品
那麼,如何計算相似度呢?
根據數據類型的不同,相似度的計算方式也不同,數據類型有:
一般的,相似度計算有 傑卡德相似度、餘弦相似度、皮爾遜相關系數
在協同過濾推薦演算法中,我們更多的是利用用戶對物品的評分數據集,預測用戶對沒有評分過的物品的評分結果。
用戶-物品的評分矩陣,根據碧亮備評分矩陣的稀疏程度會有不同的解決方案。
目的:預測用戶1對於物品E的評分
步驟分析:
實現過程
用戶之間的兩兩相似度:
物品之間的兩兩相似度:
⑥ 推薦演算法之模型協同過濾(1)-關聯規則
關聯規則是數據挖掘中的典型問題之一,又被稱為購物籃分析,這是因為傳統的關聯規則案例大多發生在超市中,例如所謂的啤酒與尿布傳說。事實上,「購物籃」這個詞也揭示了關聯規則挖掘的一個重要特點:以交易記錄為研究對象,每一個購物籃(transaction)就是一條記錄。關聯規則希望挖掘的規則就是:哪些商品會經常在同一個購物籃中出現,其中有沒有因果關系。為了描述這種「經常性」及「因果關系」,分析者定義了幾個指標,基於這些指標來篩選關聯規則,從而得到那些不平凡的規律。
(1)計算支持度
支持度計數:一個項集出現在幾個事務當中,它的支持度計數就是幾。例如{Diaper, Beer}出現在事務 002、003和004中,所以它的支持度計數是3
支持度:支持度計數除沖脊於總的事務數。例如上例中總的事務數為4,{Diaper, Beer}的支持度計數為3,所以它的支持度是3÷4=75%,說明有75%的人同時買了Diaper和Beer。
(2)計算置信度
置信度:對於規則{Diaper}→{Beer},{Diaper, Beer}的支持度計數除於{Diaper}的支持度計數,為這個規則的置信度。例如規則{Diaper}→{Beer}的置信度為3÷3=100%。說明買了Diaper的人100%也買了旅判此Beer。
一般地,關聯規則被劃分為動態推薦,而協同過濾則更多地被視為靜態推薦。
所謂動態推薦,就是推薦的基礎是且只是當前一次(最近一次)的購買或者點擊。譬如用戶在網站上看了一個啤酒,系統就找到與這個啤酒相關的關聯規則,然後根據這個規則向用戶進行推薦。而靜態推薦則是在對用戶進行了一定分析的基礎上,建立了這個用戶在一定時期內的偏好排序,然後在這段時期內持續地按照這個排序來進行推薦。由此可見,關聯規則與協同過濾的策略思路是完全不同的類型。
事實上,即便在當下很多能夠拿到用戶ID的場景,使用動態拆迅的關聯規則推薦仍然是值得考慮的一種方法(尤其是我們經常把很多推薦方法的結果綜合起來做一個混合的推薦),因為這種方法的邏輯思路跟協同過濾有著本質的不同,問題似乎僅僅在於:個人的偏好到底有多穩定,推薦到底是要迎合用戶的長期偏好還是用戶的當下需求。
挖掘關聯規則主要有Apriori演算法和FP-Growth演算法。後者解決了前者由於頻繁的掃描數據集造成的效率低下缺點。以下按照Apriori演算法來講解。
step 1: 掃描數據集生成滿足最小支持度的頻繁項集。
step 2: 計算規則的置信度,返回滿足最小置信度的規則。
如下所示,當用戶購買1商品時推薦2、3商品
⑦ Neo4j 做推薦 (2)—— 基於內容的過濾
原文地址:Neo4j 做推薦 (2)—— 基於內容的過濾
基於內容的過濾(Content-based filtering):該技術通過比較商品之間的相似性或者相關性進行推薦。這種方式忽略用戶的購買行為,只考慮商品之間的相似關系。
MATCH p=(m:Movie {title: "Net, The"})-[:ACTED_IN|:IN_GENRE|:DIRECTED*2]-() RETURN p LIMIT 25
運行結果如下圖:
分析:
Cypher 語句的意思是:找出25條記錄,該記錄滿足以下條件之一:
該記錄中的電影是電影m 有相同的流派(IN_GENRE)
出演過電影m的演員,出演過該電影(ACTED_IN)
執導過電影m的導演,執導過該電影(DIRECTED)
注意:此語句返回的記錄P,是一條關系鏈,並不僅僅是某一部電影。
另外,關系的運算,用到了 | 或。:DIRECTED*2 中的 *2 表示關系長度為2的關系。
這里舉個例子:
MATCH p=(m:Movie {title: "Net, The"})-[:DIRECTED]-() RETURN relationships(p) as r
返回結果:
╒════╕
│"r" │
╞════╡
│[{} ]│
└────┘
MATCH p=(m:Movie {title: "Net, The"})-[:DIRECTED*2]-() RETURN relationships(p) as r
返回結果:
╒═══════╕
│"r" │
╞═══════╡
│[{},{}]│
├───────┤
│[{},{}]│
├───────┤
│[{},{}]│
├───────┤
│[{},{}]│
└───────┘
MATCH p=(m:Movie {title: "Net, The"})-[:DIRECTED*]-() RETURN relationships(p) as r
返回結果:
╒═══════╕
│」r」 │
╞═══════╡
│[{}] │
├───────┤
│[{},{}]│
├───────┤
│[{},{}]│
├───────┤
│[{},{}]│
├───────┤
│[{},{}]│
└───────┘
從上面可以看出,[:DIRECTED] 表示一層關系, [:DIRECTED* 2]表示2層關系,[:DIRECTED*] 表示任意多層關系。
Neo4j 做推薦 (1)—— 基礎數據
Neo4j 做推薦 (2)—— 基於內容的過濾
Neo4j 做推薦 (3)—— 協同過濾
Neo4j 做推薦 (4)—— 基於內容的過濾(續)
Neo4j 做推薦 (5)—— 基於類型的個性化建議
Neo4j 做推薦 (6)—— 加權內容演算法
Neo4j 做推薦 (7)—— 基於內容的相似度量標准
Neo4j 做推薦 (8)—— 協同過濾(利用電影評級)
Neo4j 做推薦 (9)—— 協同過濾(人群的智慧)
Neo4j 做推薦 (10)—— 協同過濾(皮爾遜相似性)
Neo4j 做推薦 (11)—— 協同過濾(餘弦相似度)
Neo4j 做推薦 (12)—— 協同過濾(基於鄰域的推薦)
⑧ 推薦系統(一):基於物品的協同過濾演算法
協同過濾(collaborative filtering)演算法是最經典、最常用的推薦演算法。其基本思想是收集用戶偏好,找到相似的用戶或物品,然後計算並推薦。
基於物品的協同過濾演算法的核心思想就是:給用戶推薦那些和他們之前喜歡的物品相似的物品。主要可分為兩步:
(1) 計算物品之間的相似度,建立相似度矩陣。
(2) 根據物品的相似度和用戶的歷史行為給用戶生成推薦列表。
相似度的定義有多種方式,下面簡要介紹其中幾種:
其中,分母 是喜歡物品 的用戶數,而分子 是同時喜歡物品 和物品 的用戶數。因此,上述公式可以理解為喜歡物品 的用戶中有多少比例的用戶也喜歡物品 。
上述公式存在一個問題。如果物品 很熱門, 就會很大,接近1。因此,該公式會造成任何物品都會和熱門的物品有很大的相似度,為了避免推薦出熱門的物品,可以用下面的公式:
這個公式懲罰了物品 的權重,因此減輕了熱門物品會和很多物品相似的可能性。
另外為減小活躍用戶對結果的影響,考慮IUF(nverse User Frequence) ,即用戶活躍度對數的倒數的參數,認為活躍用戶對物品相似度的貢獻應該小於不活躍的用戶。
為便於計算,還需要進一步將相似度矩陣歸一化 。
其中 表示用戶 對物品 的評分。 在區間 內,越接近1表示相似度越高。
表示空間中的兩個點,則其歐幾里得距離為:
當 時,即為平面上兩個點的距離,當表示相似度時,可採用下式轉換:
距離越小,相似度越大。
一般表示兩個定距變數間聯系的緊密程度,取值范圍為[-1,1]
其中 是 和 的樣品標准差
將用戶行為數據按照均勻分布隨機劃分為M份,挑選一份作為測試集,將剩下的M-1份作為訓練集。為防止評測指標不是過擬合的結果,共進行M次實驗,每次都使用不同的測試集。然後將M次實驗測出的評測指標的平均值作為最終的評測指標。
對用戶u推薦N個物品(記為 ),令用戶u在測試集上喜歡的物品集合為 ,召回率描述有多少比例的用戶-物品評分記錄包含在最終的推薦列表中。
准確率描述最終的推薦列表中有多少比例是發生過的用戶-物品評分記錄。
覆蓋率反映了推薦演算法發掘長尾的能力,覆蓋率越高,說明推薦演算法越能夠將長尾中的物品推薦給用戶。分子部分表示實驗中所有被推薦給用戶的物品數目(集合去重),分母表示數據集中所有物品的數目。
採用GroupLens提供的MovieLens數據集, http://www.grouplens.org/node/73 。本章使用中等大小的數據集,包含6000多用戶對4000多部電影的100萬條評分。該數據集是一個評分數據集,用戶可以給電影評1-5分5個不同的等級。本文著重研究隱反饋數據集中TopN推薦問題,因此忽略了數據集中的評分記錄。
該部分定義了所需要的主要變數,集合採用字典形式的數據結構。
讀取原始CSV文件,並劃分訓練集和測試集,訓練集佔比87.5%,同時建立訓練集和測試集的用戶字典,記錄每個用戶對電影評分的字典。
第一步循環讀取每個用戶及其看過的電影,並統計每部電影被看過的次數,以及電影總數;第二步計算矩陣C,C[i][j]表示同時喜歡電影i和j的用戶數,並考慮對活躍用戶的懲罰;第三步根據式\ref{similarity}計算電影間的相似性;第四步進行歸一化處理。
針對目標用戶U,找到K部相似的電影,並推薦其N部電影,如果用戶已經看過該電影則不推薦。
產生推薦並通過准確率、召回率和覆蓋率進行評估。
結果如下所示,由於數據量較大,相似度矩陣為 維,計算速度較慢,耐心等待即可。
[1]. https://blog.csdn.net/m0_37917271/article/details/82656158
[2]. 推薦系統與深度學習. 黃昕等. 清華大學出版社. 2019.
[3]. 推薦系統演算法實踐. 黃美靈. 電子工業出版社. 2019.
[4]. 推薦系統演算法. 項亮. 人民郵電出版社. 2012.
[5]. 美團機器學習實踐. 美團演算法團隊. 人民郵電出版社. 2018.
⑨ 學IT的,寫了一個電影推薦系統,但是為什麼評分預測值大於五
全文以「預測電影評分」例子展開
r(i,j)=0則表明user_j沒有對movie_i 沒有評分,
推薦系統要做的就是通過預測user_j對這些movie {i|r(i,j)=0}的評分來給user_j 推薦其可能會喜歡的電影<預測評分較高的movie>
=======================================二、基於內容的推薦=======================================
對每個movie_i引入特徵x(i)=(x1, x2),這種特徵可能表明user對movie類型的偏好:浪漫or動作等
對於每個user引入一個參數theta,然後對評分矩陣的每列(對應一個user)做線性回歸,數據是{ (x(i), y(i,j)) |r(i,j)=1,for some j all i}
像機器學習一樣,x(i)添加個1變數x(i)=(1, x1, x2)
那麼對於未評分的movie_t,我們可以使用線性回歸訓練的參數theta與對應特徵x(t)做內積來得到其預測評分
對每個用戶都訓練一個參數theta_j,優化模型如下:
優化演算法:注意正則項是不約束x(i)=(1, x1, x2)中1對應的參數theta的第一項theta0,所以k=0與k=1,2分別對待
=======================================三、協同過濾=======================================
現在換個角度:如果知道theta for all user j,如何來預測x(i) = (x1, x2) all i
仍然可以使用線性回歸,為訓練每個x(i),需要評分矩陣的第i行數據{ (x(i), y(i,j)) |r(i,j)=1,for some i all j}
theta_j = (0, theta1, theta2) ;theta1=5說明user_j喜歡romance類movie, theta2=5說明user_j喜歡action類movie,只能有一個等於5哦,
我覺得也可以是:theta_j = (0, 4, 1) ;喜歡romance 4 action 1.
對應的優化:
協同過濾:交替優化theta與x
=========================================四、協同過濾演算法=======================================
優化:
優化:注意去掉了theta和x的添加項
=========================================五、實現細節補充=======================================
實現細節:
如果有user沒有對任何電影評分或者所有評分的電影都是0分,那麼所學習到的參數是零向量,
則預測都是0值,這是不合理的。通過 將評分矩陣減去其行均值再進行線性回歸來「避免」這種情況
=========================================六、一點思考==========================================
協同過濾那塊,同時優化theta、x,這樣得到的theta、x還有特定的意義<比如:x是否還表徵對影視類型的喜愛與否>沒有?
回歸中,在x數據上不添加1-feature是不是因為後來引入的平均值化;如果不是,那會對結果有什麼影響?
用x-feature來表徵一個movie,x-feature的各分量的可解釋性;應該會有一部分user應為演員的緣故有一些"偏愛"。
這里,講的"基於內容的推薦"與"協同過濾"跟以前對這兩個詞的認識/所指內容不同,查清楚、搞明白。
這周還會再更一篇關於此節課的演算法實現,會對上述部分問題做出回答。
⑩ 推薦演算法小結
輸入 :與用戶相關的包含眾多特徵(feature)的數據:
用戶的注冊信息(職業、年齡、性別等 顯信息),行為信息(使用功能、有效使用時長等 隱信息)。
輸出 :推薦給用戶的功能列表(根據得分高低排序)
函數 : 傳統演算法 、 機器學習演算法 (Machine Learning)、 深度學習演算法 (Deep Learning)
基於流行度的演算法非常簡單粗暴,類似於各大新聞、微博熱榜等,根據VV、UV、日均PV或分享率等數據來按某種熱度(加權)排序來推薦給用戶。
訪問次數 (VV):記錄1天內所有訪客訪問了該網站多少次,相同的訪客有可能多次訪問該網站,且訪問的次數累加。
獨立訪客 (UV):記錄1天內所有訪客訪問了該網站多少次,雖然相同訪客能多次訪問網站,但只計算為1個獨立訪客。
PV訪問量 (Page View):即頁面訪問量,每打開一次頁面或者刷新一次頁面,PV值+1。
優點:該演算法簡單,適用於剛注冊的新用戶
缺點:無法針對用戶提供個性化的推薦
改進:基於該演算法可做一些優化,例如帆喚加入用戶分群的流行度進行排序,通過把熱榜上的體育內容優先推薦給體育迷,把政要熱文推給熱愛談論政治的用戶。
基於用戶的協同過濾推薦演算法 (UserCF):針對目標用戶(A),先通過興趣、愛好或行為習慣找到與他相似的「其他用戶」(BCD...),然後把BCD...喜歡的並且A沒有瀏覽過的物品或功能推給A。
基於物品的協同過濾推薦演算法 (ItemCF):例如由於我之前看過張藝謀導演的《英雄》這部電影,會給我推薦《紅高粱》、《歸來》等同導演電影。
1)分析各個用戶對物品的評價,通過瀏覽記錄、購買記錄等得到用戶的隱性評分;
2)根據用戶對物品的隱性評分計算得到所有用戶之間的相似度;
3)選出與目標用戶最相似的K個用戶;
4)將這K個用戶隱性評分最高並且目標用戶又沒有瀏覽過的物品推薦給目標用戶。
優點:
基於用戶的協同過濾推薦演算法是給目標用戶推薦那些和他有共同興趣的用戶喜歡的物品,所以該演算法推薦較為社會化,即推薦的物品是與用戶興趣一致的那個群體中的熱門物品;
適於物品比用戶多、物品時效性較強的情形,否則計算慢;
能實現跨領域、驚喜度高的結果。
缺點:
在很多時候,很多用戶兩兩之間的共同評分僅有幾個,也即用戶之間的重合度並不高,同時僅有的共同打了分的物品,往往是一些很常見的物品,如票房大片、生活必需品;
用戶之間的距離可能變得很快,這種離陸轎正線演算法難以瞬間更新推薦結果;
推薦結果的個性化較弱、較寬泛。
改進:
兩個用戶對流行物品的有相似興趣,絲毫不能說明他們有相似的興趣,此時要增加懲罰力度;
如果兩個用戶同時喜歡了相同的物品,那麼可以給這兩個用戶更高的相似度;
在描述鄰居用戶的偏好時,給其最近喜歡的物品較高權重;
把類似地域用戶的行為作為推薦的主要依據。
1)分析各個用戶對物品的瀏覽記錄;
2)依據瀏覽記錄分析得出所有物品之間的相似度;
3)對於目標用戶評價高的物品,找出與之相似度最高的K個物品;
4)將這K個物品中目標用戶沒有瀏覽過的物品推薦給目標用戶
優點:
基於物品的協同過濾推薦演算法則是為目標用戶推薦那些和他之前喜歡的物品類似的物品,所以基於物品的協同過濾推薦演算法的推薦較為個性,因為推薦的物品一般都滿足目標用戶的獨特興趣。
物品之間的距離可能是根據成百上千萬的用戶的隱性評分計算得出,往往能在一段時間內保持穩定。因此,這種演算法可以預先計算距離,其在線部分能更快地生產推薦列表。
應用最廣泛,尤其以電商行業為典型。
適於用戶多、物品少的情形,否則計算慢
推薦精度早悔高,更具個性化
傾向於推薦同類商品
缺點:
不同領域的最熱門物品之間經常具有較高的相似度。比如,基於本演算法,我們可能會給喜歡聽許嵩歌曲的同學推薦汪峰的歌曲,也就是推薦不同領域的暢銷作品,這樣的推薦結果可能並不是我們想要的。
在物品冷啟動、數據稀疏時效果不佳
推薦的多樣性不足,形成信息閉環
改進:
如果是熱門物品,很多人都喜歡,就會接近1,就會造成很多物品都和熱門物品相似,此時要增加懲罰力度;
活躍用戶對物品相似度的貢獻小於不活躍的用戶;
同一個用戶在間隔很短的時間內喜歡的兩件商品之間,可以給予更高的相似度;
在描述目標用戶偏好時,給其最近喜歡的商品較高權重;
同一個用戶在同一個地域內喜歡的兩件商品之間,可以給予更高的相似度。
(相似度計算:餘弦相似度、Jaccard系數、皮爾森相關系數等)
常見經典 ML 分類演算法:
邏輯回歸 (Logistics Regression)
支持向量機 (SVM)
隨機森林 (Random Forest)
提升類演算法 (Boosting):Adaboost、GBDT、XGboost
一般處理流程:數據處理 -> 特徵工程 -> 模型選擇 -> 交叉驗證 -> 模型選擇與模型融合
特徵清洗 :剔除不可信樣本,預設值極多的欄位不予考慮
特徵預處理 :單個特徵(歸一化,離散化,缺失值補全,數據變換),多個特徵(PCA/LDA降維,特徵選擇)
使用工具 :pandas(python開源庫)
模型選擇與模型融合 :根據交叉驗證得分選擇前幾名模型,然後進行模型融合(Bagging、Boosting、Stacking)
DL 優勢 :ML 中特徵工程是十分重要並且要根據行業經驗確定,DL 可以自己從數據中學習特徵。DL 能自動對輸入的低階特徵進行組合、變換,得到高階特徵。對於公司產品應用領域來說,用戶的注冊信息(職業、年齡、性別等 顯信息),行為信息(使用功能、有效使用時長等 隱信息)。這些就可以作為低階特徵輸入。
RNN系列 (處理文本數據)
CNN系列 (處理圖像數據)
DNN (處理一般性分類)