推荐算法笔记_机器学习【上】
2022-01-27 本文已影响0人
Nefelibatas
尽管深度学习推荐模型已经成了推荐、广告、搜索领域的主流,但传统推荐模型仍是基础。且在某些应用中仍使用广泛。
-
可解释性强
-
硬件条件低
-
易于训练和部署
-
小数据场景应用广泛
传统推荐模型
image-20211231213507090.png
蓝色部分使用的特征比较少,主要是用户、item、标签/评分,形式简单。
黄色部分为用户画像特征、上下文信息、商品画像等等,特征比较丰富。
倒排索引:
现在搜索引擎的核心技术之一,其核心目的是将从大量文档中查找包含某些词的文档集合这一任务用O(1)或O(log n)的时间复杂度完成。
步骤:
image-20211231213959442.png
image-20211231214021538.png
http://mocilas.github.io/2015/11/18/Python-Inverted-Index-for-dummies/
搜索VS推荐
image-20211231214127332.png
主要功能:
-
描述文档
-
文章的相似性
基于邻域的推荐算法
UserCF算法
-
找到和目标用户兴趣相似的用户集合。
-
找到这个集合中的用户喜欢的,且目标用户没有听过的物品推荐给目标用户。
Jaccardd相似性
余弦相似性
image-20211231214638809.png
def UserSimilarity(train): //用户相似性
W = dict()
for u in train.keys():
for v in train.keys():
if u == v:
continue
W[u][v] = len(train[u] & train[v])
W[u][v] /= math.sqrt(len(train[u]) \* len(train[v]) * 1.0)
return W
UserCF算法改进1
用户间产生交集的物品少,怎么办?
时间复杂度:𝑂(𝑈 ∗ 𝑈)
实际上,由于每个人的兴趣是个性化,很多用户相互之间 并没有对同样的物品产生过行为。
优化:
-
相似性描述
-
计算资源:交际为空的物品跳过,利用倒排表,得到共现矩阵(两两物品之间的关系)
image-20211231215022482.png
def UserSimilarity(train):
item_users = dict()
//建立倒排表
for u, items in train.items():
for i in items.keys():
if i not in item_users:
item_users[i] = set()
item_users[i].add(u)
C = dict()
N = dict()
//建立共现矩阵
for i, users in item_users.items():
for u in users:
N[u] += 1 # 计算用户u有多少个用品
for v in users:
if u == v:
continue
C[u][v] += 1
W = dict()
for u, related_users in C.items():
for v, cuv in related_users.items():
W[u][v] = cuv / math.sqrt(N[u] * N[v]) # 计算余弦相似性
return W
UserCF算法改进2
优化:
-
描述用户相似性
-
相似用户的实际推荐
def Recommend(user, train, W):
rank = dict()
interacted_items = train[user] //待推荐的用户u
for v, wuv in sorted(W[u].items,\ //与用户u最相似的前k个用户v的喜好
key=itemgetter(1),reverse=True)[0:K]:
for i, rvi in train[v].items:
if i in interacted_items: // 物品i已经被用户u喜好过,不再推荐
continue
rank[i] += wuv * rvi //对物品i喜好程度累加
return rank //物品i如果同时在相似物品中则排名会是最高
UserCF算法改进3:UserCF-IIF
热门物品不能差异化地度量人之间的相似性(IIF)
方法:喜好的人越多,降低权重。
更为实用,关注长尾效应
image-20211231221949616.png
ItermCF算法
一种通过分析用户行为记录,计算物品之间的相似度,并进行推荐的方法。
-
计算物品相似度。
-
将用户历史行为物品中的相似物品生成推荐列表。
对每个用户建立一个包含他喜欢的物品的列表。 将物品列表中的物品两两在共现矩阵C中加1。
计算物品相似度
def ItemSimilarity(train):
#calculate co-rated users between items
C = dict() # 共现矩阵
N = dict() # i
for u, items in train.items():
for i in users:
N[i] += 1
for j in users:
if i == j:
continue
C[i][j] += 1
#calculate finial similarity matrix W
W = dict()
for i,related_items in C.items():
for j, cij in related_items.items():
W[u][v] = cij / math.sqrt(N[i] * N[j])
return W
推荐过程
image-20211231222708982.png
def Recommendation(train, user_id, W, K):
rank = dict()
ru = train[user_id]
for i,pi in ru.items(): # 用户i对每个物品的喜好程度pi
for j, wj in sorted(W[i].items(), /
key=itemgetter(1), reverse=True)[0:K]: # 与i相似的k个物品
if j in ru:
continue
rank[j] += pi * wj # 打分
return rank
ItermCF算法改进
用户活跃度对物品相似度量不具有代表性,IUF
def ItemSimilarity(train):
#calculate co-rated users between items
C = dict()
N = dict()
for u, items in train.items():
for i in users:
N[i] += 1
for j in users:
if i == j:
continue
C[i][j] += 1 / math.log(1+len(items)*1.0) # 降低活跃用户的权重
#calculate finial similarity matrix W
W = dict()
for i,related_items in C.items():
for j, cij in related_items.items():
W[u][v] = cij / math.sqrt(N[i] * N[j])
return W
CF算法对比
image-20211231223508887.png