前言
在現今的數據驅動世界,推薦系統早已成為許多平台(如電商、串流媒體、社交網路)不可或缺的一部分。然而,傳統的推薦方法如協同過濾(Collaborative Filtering)和基於內容過濾(Content-Based Filtering)各有其局限性,例如無法處理冷啟動問題或缺乏靈活性。最近在 YouTube survey 與學習 : 關於如何利用圖形資料庫(Graph Database)提升推薦系統的方法,特別是如何透過 Neo4j 等工具實現更高效的混合推薦(Hybrid Recommendation)和 k-近鄰(k-NN)推薦。
這篇 Blog 將簡要整理我所學到的內容,主要是理論的部分,從傳統推薦方法的挑戰開始,探討如何使用圖技術來提升推薦效果,下一篇老樣子會拿一個 sample dataset 實作,並在提出實作的結果與討論,那我們開始吧!
常見傳統的推薦方法與其挑戰
1. Top 10 Recommendation(熱門推薦)
- 方法:推薦最受歡迎的前十項目。
- 問題:這種方式雖然簡單直觀,但不一定能滿足用戶的個性化需求。
- 例子:雙十一期間,購物網站推薦最熱銷的商品,如某品牌電冰箱。但如果用戶對電冰箱毫無需求,這些推薦對於促進轉換毫無幫助。
2. Content-Based Recommendation(基於內容的推薦)
- 方法:根據用戶之前喜歡的內容,推薦相似的項目。
- 問題:靈活度較低,長期使用可能會讓用戶感到無趣。
- 例子:如果用戶在 Instagram 上瀏覽過狗狗影片,系統會持續推薦相似的狗狗內容。這樣用戶可能會錯過其他類型的熱門或新興內容,降低使用體驗的多樣性。
3. Collaborative Filtering(協同過濾推薦)
- 方法:基於用戶行為或其他用戶的行為進行推薦,依賴類似用戶的偏好來提供建議。
- 問題:容易形成回音室效應,推薦內容局限於過去的行為,無法發現新的興趣或突破現有偏好。
- 例子:用戶的觀看紀錄可能會局限於某一類型,推薦引擎很難推送新的影片或商品,讓用戶嘗試新的東西。
用 Graph 技術優化推薦:更準確、更即時
雖然傳統推薦方法已在許多應用中取得不錯的成效,但隨著數據規模和需求的提升,它們的局限性逐漸顯現。這時,Graph 技術的出現為推薦系統帶來了不同的解決方案,我們能更靈活地處理複雜的關聯數據,提升推薦的質量和多樣性。
這裡會有一個疑問:是不是這些推薦方法一定得用到 graph db ? 還是現有的 relational database可以做推薦嗎?
- 結合協同過濾與內容過濾:Hybrid Recommendation
- 挑戰:協同過濾和基於內容的推薦各有優缺點,單一方法無法全面解決用戶需求。
- 解決方案:Graph 技術讓我們能將這兩種方法結合,實現混合推薦(Hybrid Recommendation)。透過圖形資料庫,我們可以同時考慮用戶行為與內容相似性,提供更強大的推薦效果。
- 優勢:
- 1) 增強推薦多樣性,讓用戶能同時看到熟悉與新穎的內容。
- 2) 解決冷啟動問題,適用於新用戶或新項目。
2. 即時推薦:Real-Time Recommendations
- 挑戰:傳統推薦系統通常需要離線計算,無法即時提供個性化建議。
- 解決方案:Neo4j 等圖形資料庫支持實時查詢,可以根據用戶當前的行為,立即生成個性化推薦。
- 優勢:
- 1) 用戶不必等待過時的推薦,能夠根據最新數據即時獲取內容。
- 2) 增強用戶體驗,提升互動性與轉化率。
混合推薦系統應用於電影推薦
場景:有一用戶剛看完 Toy story ,要推薦下一步他感興趣的電影。
步驟 1:建構數據模型
使用 Graph 技術將以下元素建模為節點與關係:
- 用戶(User):每位用戶作為一個節點。
- 電影(Movie):電影作為另一個節點。
- 評分關係(Rated):用戶與電影之間的評分作為關係,包含分數作為屬性。
這樣的數據模型可反映每位用戶對不同電影的觀看與評分記錄,為推薦系統提供基礎數據。
步驟 2:推薦的 query
推薦查詢可分為以下幾個步驟執行:
- 找到看過 Toy Story 的用戶: 查詢所有評分 Toy Story 的用戶節點
MATCH (watched:Movie {title:"Toy Story"}) <-[r1:RATED]- (user:Person)
2. 篩選評分超過 7 分的電影 :
MATCH (user) -[r2:RATED]-> (unseen:Movie)
WHERE r2.rating > 7
3. 確保電影類型與 Toy Story 相同
AND watched.genres = unseen.genres
4. 過濾出目標用戶未觀看過的電影
AND NOT ((:Person {username:"target_user"}) -[:RATED]-> (unseen))
5. 回傳與排序推薦結果
RETURN unseen.title, COUNT(*) AS recommendation_count
ORDER BY recommendation_count DESC
LIMIT 25
K-Nearest Neighbors(KNN) 應用於電影推薦
在 Graph 技術中,k-近鄰(k-NN)推薦是一種基於相似性計算的推薦方法,常用於衡量用戶或項目之間的關聯性,尤其是當我們希望為用戶推薦與其偏好相近的內容時。
場景:(跟剛剛相同)有一用戶剛看完 Toy story ,要推薦下一步他感興趣的電影。
方法:尋找與目標用戶或項目最相似的 k 個鄰居,並根據這些鄰居的行為或評分來進行推薦。
步驟 1:餘弦相似度(Cosine Similarity)概念
餘弦相似度將每個用戶或項目視為高維向量,通過計算它們之間的角度來衡量相似性。
- 將每個用戶或項目視為高維向量,餘弦相似度測量它們之間的角度。
- 當兩個向量的方向越接近時(夾角越小),相似度越高。
步驟 2:推薦流程
- 計算用戶之間的餘弦相似度: 為每個用戶計算與其他用戶的相似性。
- 找出最相似的 k 個鄰居 : 根據餘弦相似度的結果,篩選出與目標用戶最相似的 k 個用戶。
- 根據鄰居的評分進行推薦: 分析這些鄰居對於其他項目的評分,並將評分較高且目標用戶未看過的項目推薦給用戶。
步驟 3 :推薦 query
- 找到 Zoltan Varju 與他的鄰居(用戶)的相似度以及這些鄰居對不同電影的評分
MATCH (m:Movie) <-[r:RATED]- (b:Person) -[s:SIMILARITY]- (p:Person {name:'Zoltan Varju'})
2. 排除已評分的電影
WHERE NOT (p)-[:RATED]->(m)
3. 計算相似度與評分
WITH m, s.similarity AS similarity, r.rating AS rating
4. 按照相似度排序
ORDER BY m.name, similarity DESC
5. 選取前 3 個鄰居的評分 :收集與 Zoltan Varju 最相似的 3 位鄰居對每部電影的評分
WITH m.name AS movie, COLLECT(rating)[0..3] AS ratings
6. 計算推薦評分
WITH movie, REDUCE(s = 0, i IN ratings | s + i)*1.0 / LENGTH(ratings) AS recommendation
7. 排序與限制結果:回傳最適合的 25 部電影
ORDER BY recommendation DESC
RETURN movie, recommendation LIMIT 25
小心得
在這篇筆記中,我們探索了如何使用 Neo4j 進行混合推薦和 KNN 推薦,透過 Graph 技術,能夠更靈活且準確地為用戶生成即時的推薦結果,無論是基於相似用戶還是相似內容。這種方法不僅提升了推薦的質量,也解決了許多傳統推薦系統面臨的瓶頸,例如冷啟動和數據稀疏問題。下回會拿一組 dataset ,並實作在 Neo4j 中構建節點與關係,和實作推薦系統。下次見囉~