一、基于物品的協同過濾 ItemCF
\[sim(i,j) =\frac{\sum_{u\in N(i) \bigcap N(j)} 1}{\sqrt{|N(i)||N(j)|}} \]
1、協同過濾實作程序
建立user-item 的倒排表,一個字典結構:
user_item_dict = {'Tom':['亂世佳人','精武門',...],'Bob':['魂斷藍橋','活著',...],...}
使用sim_dict 來保存物品相似度矩陣,物品相似度的確定:遍歷user_item_dict所有用戶,其value 串列中共現的兩個item 相似度+1,在回圈結束之后,便得到物品相似度矩陣,
sim_dict = {} # 先保存分子資訊,最后得到最終的物品相似度矩陣
num_dict = {} # 保存分母資訊
for user in user_item_dict: # 計算分子,使用了隱式評分資料集
items = user_item_dict[user]
for i in range(len(items)):
item_u = items[i]
if item_u not in num_dict:
num_dict[item_u] = 0
num_dict[item_u] += 1
if item_u not in sim_dict:
sim_dict[item_u] = {}
for j in range(len(items)):
if j ==i:continue
item_v = items[j]
if v not in sim[item_u]
sim[item_u][item_v] = 0
sim[item_u][item_v] += 1
# 分子/分母
for u in sim_dict:
for v in sim_dict[u]:
sim[u][v] /= math.sqrt(num_dict[u]*num_dict[v])
2、協同過濾推薦程序
給用戶\(u\)進行推薦時,用戶\(u\)對物品\(i\)的喜好程度\(p(u,i)\),可以想到的是,遍歷用戶看過的物品\(j\),然后找到\(i\)與的\(j\)相似度:
\[p(u,i) = \sum_{j\in N(u)}sim(i,j) \]
二、問題及其改進:時間背景關系相關的ItemCF演算法
1、物品相似度
用戶在相隔很短時間內喜歡的物品具有更高相似度,以電影推薦為例,用戶今天看的電影和昨天看的電影其相似度在統計意義上應該大于用戶今天看的電影和一年前看的電影的相似度,
2、推薦階段
用戶近期行為相比用戶很久之前的行為,更能體現用戶現在的興趣,因此在預測用戶現在的興趣時,應該增加用戶近期行為的權重,優先推薦和他近期喜歡的物品相似的物品,
3、改進:
在得到時間資訊(用戶對物品產生行為的時間)后,通過下面公式計算物品相似度:
\[sim(i,j) =\frac{\sum_{u\in N(i) \bigcap N(j)} f(|t_{ui}-t_{uj}|)}{\sqrt{|N(i)||N(j)|}} \]
不再是乘1,而是引入了和時間有關的衰減項\(f(|t_{ui}-t_{uj}|)\),其中:
\(t_{ui}\)為用戶\(u\)對物品\(i\)產生行為的時間,\(f\)函式的含義是:用戶對物品i和j產生行為的時間越遠,則\(f(|t_{ui}-t_{uj}|)\)越小,衰減函式的選擇眾多,比如:
\[f(|t_{ui}-t_{uj}|) = \frac{1}{1+\alpha |t_{ui}-t_{uj}|} \]
在推薦階段:
\[p(u,i) = \sum_{j\in N(u)}sim(i,j) \frac{1}{1+\beta|t_0-t_{uj}|} \]
其中,\(t_0\)為當前時間,\(t_{uj}\)越靠近\(t_0\),和物品\(j\)越相似的物品就有更大的權值,\(\beta\)為衰減引數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10798.html
標籤:其他
上一篇:神經網路簡易教程
下一篇:程式員常用docker命令
