【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法
文章目录
- 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法
- 1. 论文信息
- 2. 算法介绍
- 3. 创新点小结
- 4. 实验效果
- 5. 算法结论
- 6. 代码实现
- 7. 问题及优化方向
- 1. 冷启动问题
- 2. 稀疏性问题
- 3. 可解释性
- 4. 多样性和新颖性
- 5. 扩展性和实时性
- 6. 多目标优化
- 7. 个性化和上下文感知
- 8. 抗干扰和安全性
- 后记
1. 论文信息
Amazon.com 推荐系统:基于Item-to-Item的协同过滤
@article{linden2003amazon,
title={Amazon. com recommendations: Item-to-item collaborative filtering},
author={Linden, Greg and Smith, Brent and York, Jeremy},
journal={IEEE Internet computing},
volume={7},
number={1},
pages={76–80},
year={2003},
publisher={IEEE}
}
在2017年,当国际学术期刊《IEEE Internet Computing》庆祝其成立20周年时,编辑委员会决定从其出版历史中选出一篇最能经受住“时间考验”的论文。经过激烈的讨论,最终这项荣誉给到了2003年由当时亚马逊研究员Greg Linden、Brent Smith和Jeremy York撰写的一篇论文《Amazon.com Recommendations Item-to-Item Collaborative Filtering》。
2. 算法介绍
作为全球知名的电商平台Amazon,很早就开始在其平台上大规模应用机器学习算法进行在线产品的推荐。这其中,协同过滤(Collaborative Filtering)是最常见且基础的一种在线产品推荐方法。
协同推荐有多种不同的方法,通常归为两大类:基于用户的协同推荐(User-based Collaborative Filtering, UserCF) 与 基于商品得协同推荐(Item-based Collaborative Filtering, ItemCF)。 两者的原理和区别对比,简要梳理如下:
**基于用户的协同过滤**(User-based Collaborative Filtering)
- 原理:通过分析用户之间的相似度来找到目标用户的相似用户群体,然后根据这些相似用户的喜好为用户进行推荐。
- 适用场景:适用于用户个性化兴趣不太明显,且时效性较强的领域,例如新闻推荐。
- 优点:能够捕捉用户的动态兴趣变化,对新用户也能产生不错的推荐效果。
- 缺点:随着用户数量的增加,计算用户相似度的开销会急剧上升,对于用户兴趣分布不均匀的情况,可能无法找到足够多的相似用户。
- 推荐重点:寻找具有相似兴趣的用户群体,推荐这些群体中受欢迎的商品。
基于商品的协同过滤(Item-based Collaborative Filtering)
- 原理:通过分析商品之间的相似度来为用户推荐与他们之前喜欢的商品相似的其他商品。
- 适用场景:适用于商品相似性较高的情况,对于解决数据稀疏和冷启动问题有较好的效果。
- 优点:计算效率相对较高,尤其是当用户量较大时,因为商品的数量通常远少于用户的数量。
- 缺点:可能无法很好地捕捉到用户兴趣的变化,且对于新商品可能难以立即产生推荐。
- 推荐重点:基于用户过去喜欢的商品,推荐相似的商品。
对比
- 用户规模:User-based CF随着用户数量的增加,计算相似度的开销会急剧上升,而Item-based CF由于商品数量通常少于用户数量,计算效率相对较高。
- 新用户/新商品:User-based CF对于新用户也能产生不错的推荐效果,而Item-based CF对于新商品可能难以立即产生推荐。
- 兴趣变化:User-based CF能够捕捉用户的动态兴趣变化,而Item-based CF可能无法很好地做到这一点。
- 冷启动问题:Item-based CF对于解决数据稀疏和冷启动问题有较好的效果,而User-based CF在面对数据稀疏或冷启动问题时可能效果较差。
- 实时性:User-based CF适用于时效性较强的推荐,如新闻推荐,而Item-based CF更适用于商品相似性较高的情况。
基于用户的协同过滤采用基于其他用户(顾客)的偏好来预测给定用户(顾客)的偏好。这些工作的研究重点集中在挖掘和找到与当前用户相似的其他用户集合,并且基于这些相似用户的购买信息来对当前用户进行推荐。
不过,亚马逊的研究者在论文《Amazon.com Recommendations Item-to-Item Collaborative Filtering》中颠倒了这个概念,找到了一种不同的方法来做这件事,这种方法在在线推荐的扩展性和质量特性方面都更好。这种更好的方法是将产品推荐 基于产品之间的相关性,而不是顾客之间的相似性。这里,相关性的概念 仍然来自于顾客的购买历史:如果购买A的顾客非常可能购买B,那么商品B就与商品A相关。
该项算法的详细工作原理如下:
(1) 构建相似商品表
首先构建一个相似商品表,这个表里面记录哪些商品经常被一起购买。 构建方法如下:
- 遍历商品目录:
对相似商品表中的每个商品 I i I_{i} Ii,算法遍历所有购买过 I i I_{i} Ii的用户 C C C;- 记录共同购买:
对于每个这样的用户 C C C,算法查看他们还购买了其他哪些商品 I j I_{j} Ij,并记录下来;- 计算相似度:
对每个商品 I j I_{j} Ij,算法计算 I i I_{i} Ii 与 I j I_{j} Ij之间的相似度。这里相似度的计算可以是任意方法,比如常用的余弦相似度。
(2)相似度计算
相似度的计算通常使用余弦相似度公式,该公式通过计算两个向量之间的夹角的余弦值来确定它们的相似度。在这种情况下,向量是商品,而向量的维度是购买这些商品的顾客集合。
similarity
(
I
i
,
I
j
)
=
∑
c
∈
U
1
(
c
购买
I
i
)
×
1
(
c
购买
I
j
)
∑
c
∈
U
1
(
c
购买
I
i
)
×
∑
c
∈
U
1
(
c
购买
I
j
)
\text{similarity}(I_{i}, I_{j}) = \frac{\sum_{c \in U} 1(c \text{购买}I_{i}) \times 1(c \text{购买}I_{j})}{\sqrt{\sum_{c \in U}1(c \text{购买}I_{i})} \times \sqrt{\sum_{c \in U}1(c \text{购买}I_{j})} }
similarity(Ii,Ij)=∑c∈U1(c购买Ii)×∑c∈U1(c购买Ij)∑c∈U1(c购买Ii)×1(c购买Ij)
这里
U
U
U是所有购买商品得用户集合,
1
1
1是指示函数,在条件成立时为1,否则为0。
(3)生成推荐结果
在上面(2)计算得到每个商品
I
i
I_{i}
Ii的所有相似商品
I
j
I_{j}
Ij的相似度后,按照相似度或者推荐需要选择TopK的结果,作为商品
I
i
I_{i}
Ii的推荐列表。
商品到商品得协同过滤除了改进推荐的思路,而且还提供了显著的计算优势。找到一个与给定访客购买历史最相似的顾客群体,将需要在亚马逊整个顾客数据库中比较购买历史。这在单次网站访问中将是非常耗时的。然而,由于商品之间的相似性计算是可以提前在离线阶段计算,并且可以直接通过offline-to-online的方式加载到在线,采用KV表或者倒排索引的方式,直接进行在线快速查询,因此在线应用时的计算性能更优。
总的来说,该算法的优势:
- 实时推荐:由于相似商品表是预先计算好的,因此生成推荐的过程非常快,可以实时完成。
- 可扩展性:算法的在线部分仅依赖于用户购买或评分的商品数量,而不是整个目录的大小或总客户数量,因此可以很好地扩展到大规模数据集。
- 质量保证:算法推荐高度相关的相似商品,因此推荐质量很高。
3. 创新点小结
文章的主要创新点是提出了一种新的推荐算法——基于Item-to-Item的协同过滤(item-to-item collaborative filtering)。与传统的协同过滤算法相比,这种算法在在线计算时,其规模与客户数量和产品目录中的物品数量无关。这种算法能够实时产生推荐,并且能够扩展到庞大的数据集,同时生成高质量的推荐。
4. 实验效果
- 数据集规模:亚马逊拥有超过2900万客户和数百万目录商品。
- 性能:算法的在线部分——查找用户购买和评分的相似商品——其规模与目录大小或总客户数量无关;它仅依赖于用户购买或评分的商品数量。因此,即使对于非常大的数据集,算法也非常快速。
- 推荐质量:与传统的协同过滤相比,该算法即使在用户数据有限的情况下也能表现良好,能够基于仅有的两三个商品产生高质量的推荐。
5. 算法结论
推荐算法为大型零售商提供了一种有效的目标营销形式,通过为每个客户创造个性化的购物体验。对于像亚马逊这样的大型零售商来说,一个好的推荐算法需要在非常大的客户基础和产品目录上具有可扩展性,生成在线推荐的时间只需不到一秒,并且能够立即对用户数据的变化做出反应,为所有用户提供引人注目的推荐,无论他们购买和评分的数量如何。与其他算法不同,基于商品的协同过滤能够应对这一挑战。
6. 代码实现
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from scipy.sparse import csr_matrix
def generate_user_item_matrix(ratings):
"""
生成用户-商品矩阵
"""
unique_users = set(ratings['user_id'])
unique_items = set(ratings['item_id'])
user_item_matrix = csr_matrix((len(unique_users), len(unique_items)), dtype=np.float32)
for _, row in ratings.iterrows():
user_id = unique_users.index(row['user_id'])
item_id = unique_items.index(row['item_id'])
user_item_matrix[user_id, item_id] = row['rating']
return user_item_matrix, unique_users, unique_items
def calculate_item_similarity(user_item_matrix):
"""
计算商品之间的相似度
"""
similarity_matrix = cosine_similarity(user_item_matrix)
return pd.DataFrame(similarity_matrix, index=user_item_matrix.columns, columns=user_item_matrix.columns)
def get_recommendations(item_similarity, user_item_matrix, user_id, item_id, num_recommendations=5):
"""
为用户生成推荐
"""
user_ratings = user_item_matrix.getrow(user_id).toarray().ravel()
item_index = list(user_item_matrix.columns).index(item_id)
similar_items = item_similarity[item_index]
scores = similar_items.dot(user_ratings).diagonal()
scores_list = list(enumerate(scores))
scores_list = sorted(scores_list, key=lambda x: x[1], reverse=True)
recommended_items = [x[0] for x in scores_list[num_recommendations:]]
return recommended_items
# 示例数据
ratings = pd.DataFrame({
'user_id': [1, 1, 2, 2, 3, 3, 4, 4],
'item_id': [1, 2, 1, 3, 2, 3, 1, 3],
'rating': [5, 3, 4, 2, 5, 1, 4, 5]
})
# 生成用户-商品矩阵
user_item_matrix, unique_users, unique_items = generate_user_item_matrix(ratings)
# 计算商品相似度
item_similarity = calculate_item_similarity(user_item_matrix)
# 获取推荐
user_id_to_test = 1
item_id_to_test = 1
recommendations = get_recommendations(item_similarity, user_item_matrix, user_id_to_test, item_id_to_test)
print(f"Recommended items for user {user_id_to_test} based on their rating of item {item_id_to_test}: {recommendations}")
7. 问题及优化方向
虽然亚马逊所提的ItemCF方法很经典,也被大量的公司应用,但是在实际做业务时,通常还是会面临一些问题,需要做优化改造。简要说下,主要有以下几个问题及优化点:
这篇论文提出的基于商品的协同过滤算法虽然在很多方面都非常有效,但它也有一些潜在的不足和改进空间。以下是一些可能的优化方向:
1. 冷启动问题
不足:新用户或新商品(冷启动问题)可能没有足够的交互数据来生成准确的推荐。
优化方向:可以结合内容基础的推荐方法,利用商品之间的内容信息相似性(如类别、标签、描述、图像内容等)来为新用户或新商品生成初步推荐。
2. 稀疏性问题
不足:在大规模数据集中,用户-商品交互矩阵通常是稀疏的,这意味着很多潜在的推荐机会没有被捕捉到。
优化方向:一种思路是可以通过增加更多的用户和商品特征来增加数据的密度,例如用户的浏览历史、搜索记录等。另外一种思路则是对交互用户的定义进行广义化,做泛个性化推荐,例如从单一的用户到用户人群、用户国家,从而将单一用户上的行为转换到人群或者国家的行为,那么可以在人群或者国家粒度上做item-to-item的协同推荐。
3. 可解释性
不足:协同过滤算法通常被认为是“黑箱”模型,因为它们不提供推荐解释。
优化方向:可以结合规则基础或解释性的模型来提供推荐解释,增加用户对推荐系统的信任。
4. 多样性和新颖性
不足:算法可能会推荐流行的商品,而忽视了长尾中的新颖或多样性商品。
优化方向:可以通过引入多样性和新颖性的指标来优化推荐列表,确保推荐不仅流行而且多样和新颖。
5. 扩展性和实时性
不足:虽然算法在处理大规模数据集时表现良好,但在数据持续增长的情况下,维护相似商品表的成本可能会很高。
优化方向:可以探索增量更新相似商品表的方法,而不是从头开始重新计算,以提高算法的扩展性和实时性。利用流式数据处理技术,在线增量更新相似商品表,从而提升数据的时效性。
6. 多目标优化
不足:算法主要优化的是点击率或转化率,可能忽视了其他重要的业务指标。
优化方向:可以同时考虑多个业务目标,如提高用户满意度、增加用户留存等,通过多目标优化来提升整体的业务效果。
7. 个性化和上下文感知
不足:算法可能没有充分考虑用户的上下文信息,如时间、地点、情绪状态等。
优化方向:可以引入上下文感知的推荐,根据用户的实时上下文信息来调整推荐策略。通常比较直接的做法是研发深度个性化推荐算法模型。
8. 抗干扰和安全性
不足:推荐系统可能容易受到恶意攻击或操纵,如通过注入虚假数据来影响推荐结果。
优化方向:可以引入对抗训练和数据清洗的方法来提高算法的鲁棒性和安全性。在工业应用中,通常会对行为用户进行异常检测,在数据预处理阶段,将短时间内有特别多交互行为的异常用户的行为记录信息剔除,从而提升数据质量。
总的来说,虽然基于商品的协同过滤算法在亚马逊等电商平台上取得了巨大成功,但是上述优化方向,可以进一步提高算法的性能和适用性,以适应不断变化的业务需求和用户行为,当然相关的研究论文实际已经有大量的工作聚集在解决上面的这些问题。
后记
如果您对我的博客内容感兴趣,欢迎三连击(点赞、收藏、关注和评论),我将持续为您带来计算机人工智能前沿技术(尤其是AI相关的大语言模型,深度学习和计算机视觉相关方向)最新学术论文及工程实践方面的内容分享,助力您更快更准更系统地了解 AI前沿技术。