本文針對無上下文信息的隱性反饋數據集(每一條行爲記錄僅僅包含用戶ID和物品ID),介紹基於用戶的協同過濾算法原理。
基於用戶的協同過濾推薦算法本質:找到和待推薦用戶相似的用戶羣,推進該用戶羣感興趣且待推薦用戶沒購買過的物品。例如下圖中, 用戶a購買過物品A、C,用戶c購買過物品A、C、D ,則用戶a和用戶c比較相似,可以考慮把物品D推薦給用戶a。
基本步驟:
- 找到和待推薦用戶相似的用戶羣;
- 找到這個用戶羣中用戶感興趣的,且待推薦用戶沒購買過的物品。
爲便於理解,本文後面示例的計算中使用下面數據: 第一列爲索引,userId是用戶標識,itemsId表是用戶購買過的物品ID。
1. 用戶相似度計算
給定用戶u和用戶v,令N(u)表示用戶u點擊過的物品集合,令N(v)爲用戶v點擊過的物品集合
餘弦相似度
Wu,v=∣N(u)∣∣N(v)∣∣N(u)⋂N(v)∣ 其中∣∗∣表示取模,即物品的個數。
Jaccard公式
Wu,v=∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣
【例】根據上述數據,生成每個用戶購買過的商品列表
可據此計算用戶相似度,例如計算用戶A和B的餘弦相似度
WA,B=∣{1,2,5}∣∣{1,3,4}∣∣{1,2,5}⋂{1,3,4}∣=31
上面公式中需要對任意兩個用戶計算相似度,這種方法的時間複雜度是O(U2),其中U標識用戶數。當用戶數量大時,計算起來會很費時。其實,並不是所有用戶購買過的物品都有交集,即存在∣N(u)⋂N(v)∣=0。因此,可以先計算出∣N(u)⋂N(v)∣=0的用戶對(u,v),然後再除以相似度中的分母得到用戶的相似度矩陣。
用戶相似度計算的步驟如下:
- 建立物品到用戶的倒排表,對於每個物品,保存購買過該物品的用戶列表;
【例】生成商品到用戶的倒排表
- 初始化用戶相似度矩陣W爲U∗U維度的全零矩陣,遍歷倒排表,對每個物品對應的用戶列表求2個元素的排列,然後將每個排列值作爲W的索引進行加1。(例如物品I對應的用戶列表爲[a,b],則排列爲{(a,b)},更新W[a][b]=W[a][b]+1和$W[b][a]=W[b][a]+1)
【例】根據倒排表生成用戶間相同商品購買量統計矩陣
- 步驟2執行結束後,得到的是每個用戶與其他用戶購買相同商品的個數,即相似度的分子,要計算相似度,還需要處於分母。以餘弦相似度爲例,遍歷W的下三角矩陣(或是上三角矩陣),計算simu,v=W[u][v]/∣N(u)∣∣N(v)∣,其中u,v爲W的索引。更新W[u][v]=W[v][u]=simu,v。
【例】 除以計算相似度的分母,得到相似度矩陣
2. 生成推薦列表
根據用戶相似度,計算待推薦用戶u對與其最相似的K個用戶購買過商品i的感興趣程度:
p(u,i)=v∈S(u.K)⋂N(i)∑Wu,vrv,i其中,S(u.K)爲和用戶u興趣最接近的K個用戶,rv,i代表用戶對物品i的興趣,因爲只是用了行爲數據,所以rv,i=1.
【例】生成推薦列表