【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法

news2024/12/23 14:49:02

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的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) 构建相似商品表
首先构建一个相似商品表,这个表里面记录哪些商品经常被一起购买。 构建方法如下:

  1. 遍历商品目录:
    对相似商品表中的每个商品 I i I_{i} Ii,算法遍历所有购买过 I i I_{i} Ii的用户 C C C;
  2. 记录共同购买:
    对于每个这样的用户 C C C,算法查看他们还购买了其他哪些商品 I j I_{j} Ij,并记录下来;
  3. 计算相似度:
    对每个商品 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)=cU1(c购买Ii) ×cU1(c购买Ij) cU1(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前沿技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node集成redis (教学)

文章目录 前言一、安装redis二、可视化界面测试连接1.vscode安装插件 三、node代码编写1.先安装两个库(redis和ioredis)2.测试连接 (前提是你的redis服务器要启动起来) 总结 前言 在Node.js中集成ioredis是一个常见的做法&#x…

最新PHP网盘搜索引擎系统源码 附教程

最新PHP网盘搜索引擎系统源码 附教程,这是一个基于thinkphp5.1MySQL开发的网盘搜索引擎,可以批量导入各大网盘链接,例如百度网盘、阿里云盘、夸克网盘等。 功能特点:网盘失效检测,后台管理功能,网盘链接管…

react18中的jsx 底层渲染机制相关原理

jsx 底层渲染机制 渲染 jsx 时,会先解析 jsx,生成一个虚拟 dom(virtual dom)。然后将虚拟 dom 渲染成真实 dom。如果 jsx 中包含事件,会将事件绑定到真实 dom 上。 虚拟 dom 对象,是框架内部构建的一套对象体系,对象…

C2W4.LAB.Word_Embedding.Part2

理论课:C2W4.Word Embeddings with Neural Networks 文章目录 Training the CBOW modelForward propagationInitialization of the weights and biasesTraining exampleValues of the hidden layerValues of the output layerCross-entropy loss BackpropagationGr…

121页PPT | 集团股份有限公司IT信息化规划报告

这份PPT是集团股份有限公司的IT信息化规划报告,全面涵盖了公司在信息化建设方面的需求分析、规划实施、投资概算以及建议方案,通过现代化信息技术提升企业的管理效率和市场竞争力。 该资料可编辑PPT格式,本文重点展现PPT整体逻辑&#xff0c…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引(BuildForwardIndex) 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章,我们将继续项…

虚拟机安装麒麟v10、配置网络、安装docker

一、虚拟机安装麒麟v10 1、下载iso(https://www.kylinos.cn/support/trial.html) 2、虚拟机安装 3、选择 4、设置开机自动连接网络 参考地址:https://www.cnblogs.com/goding/p/18283912 安装好后发现屏幕分辨率毕竟低,点设置分…

龙蟠科技业绩压力显著:资产负债率持续攀升,产能利用率也不乐观

《港湾商业观察》施子夫 黄懿 去年十月至今两度递表后,10月17日,江苏龙蟠科技股份有限公司(以下简称,龙蟠科技;603906.SH,02465.HK)通过港交所主板上市聆讯。 很快,龙蟠科技发布公告称,公司全…

缓存池(对象池)使用

框架介绍 对象池的实现是为了优化内存管理和提升性能,尤其是在创建和销毁大量对象时,通过复用已经创建的对象来减少垃圾回收的负担。 实现概述 开放公共方法 记忆已更新 这个对象池的实现是为了优化内存管理和提升性能,尤其是在创建和销…

【Spring】详解SpringMVC,一篇文章带你快速入门

目录 一、初始MVC 二、SpringMVC 三、Spring MVC的运用 ⭕RequestMapping ⭕传递参数 1、传递单个参数 2、传递多个参数 3、参数重命名 4、传递数组与集合 5、获取路径参数 6、传递JSON数据 7、上传文件 一、初始MVC MVC(Model-View-Controller&#…

python 深度学习 项目调试 识别数学公式 LaTeX-OCR

起因, 目的: 提取图片中的数学公式。 其实这个项目,我很久之前就做过。 而且,我还录了一个视频: https://www.bilibili.com/video/BV1nD421p7jS/?vd_source198e876d811b3ccea94908fd163c223f 简介: 项目来源: https://github.com/lukas-blecher/La…

MongoDB简单学习

MongoDB 一、基本使用 1.1业务应用场景 传统的关系型数据库(如Mysql),在数据库操作的“三高”需求以及对应web2.0的网站需求面前,显得力不从心 三高: High performance - 对数据库高并发读写的要求Huge Storage -…

STM32--基于STM32F103C8T6的OV7670摄像头显示

本文介绍基于STM32F103C8T6实现的OV7670摄像头显示设计(完整资源及代码见文末链接) 一、简介 本文实现的功能:基于STM32F103C8T6实现的OV7670摄像头模组实时在2.2寸TFT彩屏上显示出来 所需硬件: STM32F103C8T6最小系统板、OV76…

[C++ 11] 列表初始化:轻量级对象initializer_list

C发展历史 C11是C语言的第二个主要版本,也是自C98以来最重要的一次更新。它引入了大量的新特性,标准化了已有的实践,并极大地改进了C程序员可用的抽象能力。在2011年8月12日被ISO正式采纳之前,人们一直使用“C0x”这个名称&#…

10-1.idea中的项目结构,辅助快捷键,模块的操作

idea中的项目结构和辅助快捷键 IDEA中项目结构 首先是创建项目,新建的项目中有子项目,我们可以创建模块 然后在模块中我们可以创建包,在包中的SRC中写我们的源代码,也就是类。 VScode写Java项目 如何你电脑比较卡的话&#…

基于GPT的智能客服落地实践

📍前言 在日常生活中,「客服」这个角色几乎贯穿着我们生活的方方面面。比如,淘宝买东西时,需要客服帮你解答疑惑。快递丢失时,需要客服帮忙找回。报名参加培训课程时,需要客服帮忙解答更适合的课程…… 基…

RTE 2024 隐藏攻略

大家好!想必今年 RTE 大会议程大家都了解得差不多了,这将是一场实时互动和多模态 AI builder 的年度大聚会。 大会开始前,我们邀请了参与大会策划的 RTE 开发者社区和超音速计划的成员们,分享了不同活动的亮点和隐藏攻略。 请收…

InnoDB 存储引擎<一>InnoDB简介与MySQL存储架构及相关数据结构

目录 回顾MySQL架构 InnoDB简介 ​MySQL存储结构 回顾MySQL架构 对MySQL架构图的总结: MySQL服务器是以网络服务的方式对外提供数据库服务的,我们使用的应用程序以及客户端统称为外部程序。 外部程序通过发送网络请求的方式来连接MySQL服务器,这时首先每…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1

启动springboot项目时,出现了以下报错: defaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDjava.lang.IllegalStateException: Failed to load property source from location classpath:/application-local.yamlat o…

使用pytest单元测试框架执行单元测试

Pytest 是一个功能强大且灵活的 Python 单元测试框架,它使编写、组织和运行测试变得更加简单。以下是 Pytest 的一些主要特点和优点: 简单易用:Pytest 提供了简洁而直观的语法,使编写测试用例变得非常容易。它支持使用 assert 语…