推薦系統三十六式:近鄰推薦 學習筆記
-
作者:jliang
1.重點歸納
1)協同過濾演算法分兩類:
(1)基於記憶的協同過濾:就是記住每個使用者消費過的物品,然後給他推薦相似的東西,或者推薦相似的人消費的東西。
(2)基於模型的協同過濾:從使用者物品關係矩陣中學習一個模型,從而把矩陣空白處填滿。
2)基於人的協同過濾的步驟
(1)準備使用者向量,構造稀疏矩陣。
(2)用每個使用者的向量,兩兩計算使用者之間的相似度,設定一個相似度閾值或者設定一個最大數量,為每個使用者保留與其最相似的使用者。
(3)為每個使用者產生推薦結果:把相似使用者們喜歡過的物品彙總起來,去掉使用者自己消費過的物品,剩下的排序輸出推薦結果
使用者u與物品i的匹配分數:
為使用者u與使用者j之間(使用者u和j是相似使用者)的相似度
Rj,i為使用者j對物品i的評分
3)基於物品的協同過濾步驟
(1)構建使用者物品的關係矩陣。矩陣元素是使用者的消費行為,也可以是消費後的評價,還可以是對消費行為的某種量化如時間、次數、費用。
(2)假如矩陣的行為表示物品,列表示使用者的話,行向量之間的兩兩計算相似度得到物品相似度矩陣(行和列都是物品)
(3)產生推薦結果。根據推薦場景不同,可以是為某個物品推薦相關的物品,也可以是在個人首頁產生的類似“猜你喜歡”的推薦結果。
4)基於物品的協同過濾計算推薦結果
(1)Top K推薦,形式上屬於類似“猜你喜歡”
- 彙總和“使用者已經消費過的物品相似”的物品,按照彙總後的分數從高到低推出
- 使用者u對物品i的分數:
- 使用者評分過的物品共m個
- sim(i,j)為使用者評分過的物品j與物品i的相似度
- 不需要對所有物品都計算一遍,只需要按照使用者評分過的物品,逐一取出來和它們相似的物品出來就可以
(2)相關推薦
- 這類推薦不需要提前合併計算,當用戶訪問一個物品詳情頁面時/完成一個物品消費的結果頁面,直接獲取這個物品相似的物品推薦,就是“看了又看”或者“買了又買”的推薦結果
5)傑卡德相似度只適合布林值向量,餘弦相似度彈性略大適合兩種向量。歐式距離度量是絕對值差異,餘弦相似度的是方向的差異,但是調整的餘弦相似度則可以避免這個弱點。
2.人以群分,你是什麼人就看到什麼世界
1)協同過濾
(1)通過基於內容的推薦階段,我們有了可觀的使用者行為,這些行為可以表達成一個使用者和物品的關係矩陣。
(2)協同過濾演算法分類
- 基於記憶的協同過濾:就是記住每個使用者消費過的物品,然後給他推薦相似的東西,或者推薦相似的人消費的東西。
- 基於模型的協同過濾:從使用者物品關係矩陣中學習一個模型,從而把矩陣空白處填滿。
2)基於使用者的協同過濾
(1)根據歷史消費行為幫你找到一群和你口味相似的使用者,然後根據這些和你相似的使用者再消費了新的,你沒有見過的物品都可以推薦給你。
(2)步驟
一、準備使用者向量,向量的特點:
- 向量的維度就是物品的個數
- 向量是稀疏的
- 向量維度上 的取值可以是簡單的0/1布林值(1代表喜歡,0表示沒有),因為是稀疏向量,取值0忽略
二、用每個使用者的向量,兩兩計算使用者之間的相似度,設定一個相似度閾值或者設定一個最大數量,為每個使用者保留與其最相似的使用者。
三、為每個使用者產生推薦結果:把相似使用者們喜歡過的物品彙總起來,去掉使用者自己消費過的物品,剩下的排序輸出推薦結果。
使用者u與物品i的匹配分數:
為使用者u與使用者j之間(使用者u和j是相似使用者)的相似度。
Rj,i為使用者j對物品i的評分。
3)構造矩陣
使用稀疏矩陣儲存格式來構造矩陣,就可以使用常用的計算框架的標準輸入。
- CSR:這個儲存方式稍微複雜點,是一個整體編碼方式。它有三個組成:數值、列號和行偏移共同編碼。
- COO:這個儲存方式稍微簡單,每個元素用一個三元組表示(行號,列號,數值),只儲存有值的元素,缺失值不儲存。
4)相似度計算
(1)如果向量很長(物品很多),通常降低相似度計算複雜度的辦法有兩種:
- 對向量取樣計算。例如100維的向量隨機取出10維向量來計算相似度,損失一些精度,但計算複雜度大幅度降低。
- 向量化計算。把迴圈轉換成向量來直接計算。
(2)如果使用者量很大,緩解辦法:
- 將相似度拆成Map Reduce任務,將原始矩陣Map成鍵為使用者對,值為兩個使用者對同一個物品的評分之積Reduce階段對這些乘積再求和,Map Reduce任務結束後再對這些值歸一化。
- 不用基於使用者的協同過濾。
- 如果資料量不大(一般不超過百萬),然後又是稀疏矩陣,單機版的工具更快,如KGraph、GraphCHI等工具。
5)計算推薦分數
(1)為使用者計算每一個物品的推薦分數代價太大了,只有相似使用者喜歡過的物品需要計算。
(2)把計算過程拆成Map Reduce任務
6)一些改進
(1)懲罰對熱門物品的喜歡程度。使用者可能是被煽動,或者是無聊點選,很難反應使用者的真實興趣。
(2)增加喜歡程度的時間衰減,一般使用一個指數函式,指數就是一個負數,值和喜歡行為發生時間間隔正相關即可。因為人的口味會改變。
7)應用場景
(1)基於使用者的協同過濾輸出
- 相似的使用者列表
- 基於使用者的推薦結果
不但可以推薦物品,還可以推薦使用者,如“相似粉絲”、“和你口味相同的人”等功能。
(2)基於使用者的協同過濾強調個人私隱場景,不受大V影響,更能反映真實的興趣群體。
8)存在的問題
(1)使用者數量往往比較大,計算比較吃力
(2)使用者口味變化很快,興趣遷移問題很難反應出來
(3)資料稀疏,使用者和使用者之間的共同消費行為很少
3.解密“看了又看”和“買了又買”
1)基於物品的協同過濾(item-Based)首先計算相似物品,然後再根據使用者消費國、或者正在消費的物品為其推薦。相對於基於使用者的協同過濾的好處:
(1)物品的數量往往小於使用者的數量
(2)物品之間的相似度比較靜態,它們變化的速度沒有使用者的口味變化快
(3)物品對應的消費者數量較大,更有利於計算相似度
2)基本步驟
(1)構建使用者物品的關係矩陣。矩陣元素是使用者的消費行為,也可以是消費後的評價,還可以是對消費行為的某種量化如時間、次數、費用。
(2)假如矩陣的行為表示物品,列表示使用者的話,行向量之間的兩兩計算相似度得到物品相似度矩陣(行和列都是物品)
(3)產生推薦結果。根據推薦場景不同,可以是為某個物品推薦相關的物品,也可以是在個人首頁產生的類似“猜你喜歡”的推薦結果。
3)計算物品相似度
(1)使用者物品關係矩陣
- 向量的維度是使用者,總維度是總使用者數
- 向量的各個維度的取值是使用者對物品的消費結果
- 行為本身的布林值
- 消費行為量化如時間長短、次數多少、費用大小等
- 評價分數
- 是一個稀疏向量,沒有消費過的就不用表示出來
(2)一般選擇餘弦相似度(也可以是其它相似度計演算法)
- 分母是兩個物品向量的長度,求元素值的平方和再開方
- 分子是兩個向量的點積,相同位置的元素值相乘再求和
- 向量中大部分都是0,求和時不用算,求點積時只用管兩個物品的公共使用者,只有少量幾個乘積而已,計算量不會很大。
(3)物品相似度計算的改進
- 物品中心化
先計算每個物品收到的評分的均值,然後把物品向量中的分數減去對應物品的均值。去掉物品中鐵桿粉絲群體的非理性因素。
- 使用者中心化
先計算每個使用者評分的均值,然後把他打過的所有分數都減去這個均值。每個人標準不一樣,有的標準嚴苛,有的寬鬆,可以在一定程度上僅僅保留了偏好,去掉主觀成分。
4)計算推薦結果
(1)Top K推薦,形式上屬於類似“猜你喜歡”
- 彙總和“使用者已經消費過的物品相似”的物品,按照彙總後的分數從高到低推出
- 使用者u對物品i的分數:
- 使用者評分過的物品共m個
- sim(i,j)為使用者評分過的物品j與物品i的相似度
- 不需要對所有物品都計算一遍,只需要按照使用者評分過的物品,逐一取出來和它們相似的物品出來就可以
(2)相關推薦
- 這類推薦不需要提前合併計算,當用戶訪問一個物品詳情頁面時/完成一個物品消費的結果頁面,直接獲取這個物品相似的物品推薦,就是“看了又看”或者“買了又買”的推薦結果
5)Slope One演算法
(1)經典基於物品推薦,相似度矩陣計算無法實時更新,而且沒有考慮相似度的置信度問題。
(2)Slope One演算法專門針對評分矩陣,不適用於行為矩陣。演算法計算的是物品之間的距離,相似度的反面。
(3)例子
評分矩陣
轉換後物品距離矩陣,括號外為物品距離(評分差值),括號裡面為共同使用者數量,代表兩個物品的知心程度。物品A與物品B的差距為同時對物品A和B評分差值的平均值,即((5-3)+(3-4))/2=0.5
計算步驟
- 物品A相對物品B的距離為0.5,根據使用者3對物品B的評分(2分)預測其對物品A的評分:2+0.5=2.5
- 物品A相對物品C的距離為3,根據使用者3對物品C的評分(5分)預測其對物品A的評分:5+3=8
- 計算加權平均值:(8*1 + 2.5*2)/(1+2)=4.33
4.協同過濾中的相似度計算方法
1)推薦系統兩大門派
(1)相似度門派
- 近鄰推薦的核心就是相似度計算的選擇,由於近鄰推薦沒有采用最優化思路,所以效果通常取決於矩陣的量化方式和相似度的選擇。
- 潛在假設:如果兩個物品相似,也就是距離很近,那麼兩個物品就很容易產生一樣的動作。
- 最常用的相似度是餘弦相似度,另外還有歐氏距離、皮爾遜相關度、自適應的餘弦相似度、區域性敏感雜湊等。
(2)機器學習門派
- 如在邏輯迴歸/線性迴歸中,一邊是特徵向量,另一邊是模型引數向量,兩者的點積運算就可以看做是相似度計算,不過模型的引數是從資料中由優化演算法自動總結出來的。
2)計算相似度的向量數值有兩種
- 實數值
- 布林值,0/1
3)歐氏距離
(1)計算公式:
(2)歐式空間下度量距離的方法,歐氏距離是衡量兩個點之間的距離,歐氏距離不適合布林向量之間。
(3)通常相似度的獨立結果希望是[-1,1]或[0,1]之間,所以歐氏距離無法直接使用,需要二次轉化,E(p,q)為p和q點的距離。
(4)歐氏距離度量的是空間兩點的絕對距離,適用於分析使用者能力模型之間的差異,如消費能力、貢獻內容的能力等。
4)餘弦相似度
(1)計算公式:
(2)度量兩個向量之間的夾角,在度量文字相似度、使用者相似度、物品相似度的時候較為常用。
(3)它與向量的長度無關,只要方向一致,都視為相似。例如用140字摘要了一篇5000字的部落格內容,兩者得到的文字向量可以認為方向一致,詞頻程度不同,但是餘弦相似度任然認為他們是相似的。
(4)在協同過濾中,如果選擇餘弦相似度,某種程度上更加依賴兩個物品的共同評價使用者數,而不是使用者給予的評分多少。
(5)餘弦相似度對絕對值不敏感的問題
- 例子,使用者A對兩部電影的評分分別為1和2分,使用者B對同樣兩部電影評分是4和5分,餘弦相似度認為兩使用者非常相似。實際上使用者A明顯不喜歡這兩部電影。
- 改進版:調整的餘弦相似度
先計算向量每個維度的均值,然後每個向量在各個維度上都減去均值後再計算餘弦相似度。
5)皮爾遜相關度
(1)實際上也是一種餘弦相似度,不過先對向量做了中心化,向量p和q各自減去向量的均值後再計算餘弦相似度。結果範圍[-1,1],-1表示負相關,1表示正相關。
(2)由於皮爾遜相關度度量的是兩個變數的變化趨勢是否一致,所以不適合用作計算布林值向量之間的相關度。布林值向量只有有限的兩個值,根本沒有“變化趨勢,高低起伏”的說法。
6)傑卡德(Jaccard)相似度
(1)是兩個集合的交集個數在並集中所佔的比例。由於集合非常適用於布林向量表示,所以傑卡德相似度非常適用於布林向量。
(2)計算方法:
- 分子是兩個布林向量做點積計算,得到交集的元素個數
- 分母就是兩個布林向量做或運算,再求元素和
7)餘弦相似度適用於評分資料,傑卡德相似度適合用於隱式反饋資料,如收藏行為相似度計算。
例子:如何做社交網路好友相似度量?
- 特徵:帖子釋出數量、月均發貼數量、平均帖子字數、頭像、標籤資料(是否大V、是否營銷號、是否網紅、職業等)、統計發文Top關鍵詞向量及詞頻
- 標籤資料可計算傑卡德相似度
- Top關鍵詞可計算餘弦相似度
- 釋出量、字數等可計算歐式距離
- 最後再融合這幾個相似度得到總的相似度