推荐系统-基于物品的协同过滤(Item-based CF)

2023-10-30

今天我们来聊一聊基于物品的协同过滤即Item-based CF方法。有了上一篇的经验,你可能很容易就想到Item-based CF就是通过计算物品之间的相似度,然后用户曾与那些商品发生过交互,给他推荐与这些商品最接近的东西给他。这样做有什么好处呢?可解释性!虽然同样是计算相似度,但User-based只能说某个人看起来和你兴趣一致,他喜欢过这个所以我给你推荐这个;而Item-baed则是你曾经看过这个,所以我给你推荐了和这个相似的也许你会喜欢。很明显,第二种更具可解释性,毕竟那是从你直接发生过交互的商品中来的,而人与人之间的相似度,通过简单的统计其实并不能很好的衡量。

那么如何进行Item-baed CF呢?首先是计算物品之间的相似度。这里计算相似度并没有引进物品的属性,而是简单地通过分析用户的历史行为记录进行计算,简单地讲,就是如果有用户购买了某商品的同时又买了其他的商品,那么很有可能这两个商品就是相似的,所以还是可以用余弦相似度来度量

User-baesd CF我们建立了物品用户倒排表方便我们统计对同一商品存在交互的用户,避免把大量的时间浪费在计算没有交互的用户上,这里类似地我们建立用户商品倒排表,对某一用户发生过的所有物品进行两两之间的统计来计算物品之间的相似度,具体实现如下

def Item_Similarity(train):
    # Co-rated items between users
    C = {}
    N = {}
    W = {}
    for user, items in train.items():
        for i in items:
            if i not in N.keys():
                N[i] = 0
            N[i] += 1
            if i not in C.keys():
                C[i] = {}
                W[i] = {}
            for j in items:
                if j == i:
                    continue
                if j not in C[i].keys():
                    C[i][j] = 0
                    W[i][j] = 0
                C[i][j] += 1
    print('Co-rated items count finished')
    # Calculate similarity matrix
    for i, related_items in C.items():
        for j, cij in related_items.items():
            W[i][j] = cij/(N[i]*N[j])**0.5
    print('Similarity calculation finished')
    return W

有了相似度之后,我们就可以进行推荐了。首先找到用户历史上发生交互的所有商品,然后选择和该商品最相似且没有和用户发生交互的若干商品进入备选集,用两物品之间的相似度作为权值进行累加。这样最后就得到了一个商品及其权值的集合,选择得分最高的若干个结果推荐给用户,公式表示如下

其中rui为用户u对物品i的兴趣,这里可以简单地处理成只要发生交互就为1。代码实现如下

def Recommend(user, train, W, K):
    rank = {}
    already_items = train[user]
    for i in already_items:
        for j, wij in sorted(W[i].items(), key=itemgetter(1), reverse=True)[:K]:
            if j in already_items:
                continue
            if j not in rank.keys():
                rank[j] = 0
            rank[j] += wij
    return rank

到了这里我们已经完成了Item-baed CF的推荐过程了,下面还是用MovieLens的数据集进行离线实验。数据划分过程依旧和上次一样,训练集测试集4:1,采用8次计算的结果均值进行效果估计。该实验中主要的可变参数是选择和发生交互商品相似的商品数量K,下图显示了对于不同的K值推荐系统的性能

从图中我们可以看出,对于召回率和准确率而言,K值的变化对于其影响并不是线性的,一开始增大K值可以提高其表现,但很快就开始下降;对于覆盖率而言,由于参与推荐的商品越来越多,所以也越来越倾向于推荐热门商品,导致覆盖率随着K值得增大不断降低,对应的流行度也开始增加,但随着K增大到某种程度之后,流行度不再有明显的变化。

上一篇User-baed CF我们考虑了热门商品人人都爱,它对我们计算用户之间的相似度没有什么贡献,所以我们用Inverse Item Frequence来进行惩罚。同样的,在Item-baed CF中,存在着这样一种用户,他与很多商品都发生过交互,但他发生交互可能是因为他是做这个生意的或者怎么,并不是因为这些商品之间存在某种相似性,所以这里我们同样可以引入Inverse User Frequence来对物品相似度进行加权,从而避免这种用户的影响,新的相似度计算公式如下

我们使用相同参数(K=160,N=10)的模型,仅仅是相似度计算不同,算法的表现如下图所示

从图中可以看到,召回和准确率提升了,但同时覆盖率和流行度两个指标略有所下降,和我们的分析略微有一点点小出入,我觉得原因主要在于我懒得换新的参数,直接用K=160进行测试的,如此多的待选商品进入备选,商品的流行度和覆盖率表现肯定不好,感兴趣的同学可以试试K=20的情况,同时这也说明一点,离线实验的结果并不那么可信啊!!!

此外,对于Item-baed CF还有一个小trick,就是我们可以对相似度矩阵每一行进行归一化,这样可以得到更好的性能。为啥呢?我们知道物品通常属于若干类,我们再计算相似度的时候,类内的相似度肯定是大于类之间的相似度,这没问题,但不同类内的相似度却是不同的,这就导致我们的推荐的算法有了倾向性,它肯定会推荐更多当前计算相似度高的类。而我们对相似度进行归一化之后,不同类内的最大相似度都被归化到1,某种程度上我们可以认为每个类内的相似度是在同一尺度上的,这样就避免了上面说的那个问题,可以公平地在多个类之间进行推荐,所以这样也可以提高推荐的覆盖率,降低流行度。我们将上一个实验计算得到的相似度矩阵进行归一化之后再进行推荐比较一下性能

从图中我们可以看出对相似度进行归一化之后,所有的评价指标都得到了提高,说明归一化确实可以提高了Item-baed CF的性能。

===============================================================================

到这里对于基于邻域的两种协同过滤的方法都介绍完了,最后我们再来比较一下这两种方法的异同。

首先从原理上来看,User-baed CF是给用户推荐和他兴趣相似的用户喜欢的物品,某种程度上就是寻找一个兴趣相似的小群体,所以其推荐往往更加社会化,但可解释性不太高;而Item-baed CF则是给用户推荐与其喜欢的物品相似的商品,所以在粒度上会更细,个性化更高,而且基于历史记录的推荐,可解释性比较好。

其次,两种方法分别对应于维护两张表。基于用户的需要维护一个用户相似度的表,而基于物品的则需要维护一个物品相似度的表,所以对于用户特别多的情况,计算用户相似度矩阵代价太高,所以更适合Item-baed CF,物品太多的情况类似。对于新物品产生速度非常快如新闻推荐领域,基于物品的协同过滤明显不合适,因为只有更新了物品相似度表该物品才能被推荐,所以对于时效性要求比较高的领域User-baed CF更加合适。

最后,CF方法在我看来来其实都是基于统计的方法,因为它并没有一个学习的过程,所以算是推荐领域比较基础的算法,效果只能说还行,比较适合召回过程这种对排序没性能没有太大要求的场合;另外,CF方法基本上只用了用户历史行为记录,包括用户,包括商品还有环境等特征信息都没有使用,所以效果相比于后面的方法来说肯定会略差一点。

好啦,基于邻域的方法就到这里为止啦,下一篇我们要介绍的是LFM,隐因子模型~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

推荐系统-基于物品的协同过滤(Item-based CF) 的相关文章

  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么
  • 四种推荐系统原理介绍(基于内容过滤/协同过滤/关联规则/序列模式)

    在推荐系统中常用的技术可大致分为四类 基于内容的过滤 协同过滤 基于规则的方法和混合方法 一 基于内容过滤 基于内容过滤推荐系统思路如下 1 通过在抓取每个商品的一系列特征来构建商品档案 2 通过用户购买的商品特征来构建基于内容的用户档案
  • GA遗传优化算法(附MATLAB源码)

    优化算法之遗传算法GA 遗传算法 Genetic Algorithm GA 最早是由美国的 John holland提出 主要模拟生物进化论的自然选择和遗传学机理生成计算模型 是一种通过模拟自然进化过程搜索最优解的方法 将问题的求解过程转换
  • 【人工智能】推荐系统算法

    推荐系统算法详解 一 推荐系统详解 1 基于人口统计学的推荐算法 基于人口统计学的推荐机制 Demographic based Recommendation 是一种最易于实现的推荐方法 它只是简单的根据系统用户的基本信息发现用户的相关程度
  • 推荐系统系列——推荐算法评价指标

    文章目录 同步读书之 菜根谭 9 静坐观心 真妄毕现 10 得意早回头 拂心莫停手 推荐算法评价指标 1 评分预测指标 1 1 符号定义 1 2 平均绝对误差 1 3 均方根误差 1 4 覆盖率 2 集合推荐指标 2 1 混淆矩阵 2 2
  • 推荐系统(2)——评测指标

    根据评测体系来评价一个推荐系统的好坏 由于推荐系统是和实际收益挂钩 所以需要考虑三方 用户 物品提供者和平台 的利益 实现最大化的三方共赢 接下来从 实 验 方 法 评
  • 推荐一款优秀电商开源项目

    简介 本文给大家推荐博主自己开源的电商项目newbee mall pro 在newbee mall项目的基础上搭建而来 使用 mybatis plus 作为 orm 层框架 并添加了一系列高级功能以及代码优化 特性如下 商城首页 为你推荐
  • 基于用户 的协同过滤算法

    计算用户相似度和用户对未知物品的可能评分 基于用户的协同过滤算法主要包括两个步骤 1 找到和目标用户兴趣相似的用户集合 2 找到这个集合中的用户喜欢的 且目标用户没有听说过的物品推荐给目标用户 例如现在有A B C D四个用户 分别对a b
  • GBDT算法详解

    GBDT基本思想 GBDT的基本结构是决策树组成的森林 学习方式是梯度提升 具体的讲 GBDT作为集成模型 预测的方式是把所有子树的结果加起来 GBDT通过逐一生成决策子树的方式生成整个森林 生成新子树的过程是利用样本标签值与当前树林预测值
  • 广电大数据用户画像及营销推荐策略(四)——Python实现

    本次大数据项目数据及分析均做脱敏化和保密化 主要分享思路体系 全程用Python实现 数据和代码均不提供 如有建议欢迎讨论 4 模型构建 在实际应用中 构造推荐系统时 并不是采用单一的某种推荐方法进行推荐 为了实现较好的推荐效果 大部分都将
  • 【推荐系统】 一、推荐系统简介

    1 推荐系统的作用和意义 在这个时代 无论信息消费者还是信息生产者都面临巨大的挑战 信息消费者 在大量信息中找到自己感兴趣的信息很困难 信息生产者 将自己生产的信息让广大消费者关注很困难 推荐系统将用户与信息联系起来 1 1 用户角度 推荐
  • 【毕业设计_课程设计】基于协同过滤算法的个性化推荐系统(源码+论文)

    文章目录 0 项目说明 1 研究目的 2 研究方法 3 系统设计 3 1 前台模块 3 1 1 首页 3 1 2 个人中心 3 1 3 发布者中心 3 2 后台模块 3 2 1 首页 3 2 2 新闻管理 4 研究结论 5 界面展示 6 论
  • 大数据Hadoop学习之————基于物品的协同过滤算法实现物品推荐

    一 基础概念 协同过滤算法一般分为两种实现 基于用户的协同过滤算法 userCF 通过寻找相似兴趣的其他用户 为指定用户推荐物品 比如用户A喜欢商品A B 用户B也喜欢商品A和B 则可以认为用户A和B兴趣相似 这时候就可以像用户A推荐用户B
  • 基于协同过滤算法和深度学习的音乐推荐

    基于协同过滤算法和深度学习的音乐推荐 协同过滤 音乐推荐 深度学习 音乐检索 文章目录 基于协同过滤算法和深度学习的音乐推荐 Github 地址 微信小程序版实现 介绍 参考项目 技术栈 Docker 部署 如用此方式部署 后面的手动安装步
  • 推荐系统综述:初识推荐系统

    目录 1 引言 2 发展历史 3 研究现状 4 推荐方式和效果评估 4 1 评分预测 4 2 TopN推荐 5 推荐算法 5 1 基于用户行为推荐 5 1 1 基于用户的协同过滤 User Based CF 5 1 2 基于物品的协同过滤
  • YouTube 的视频推荐算法

    转载 https www zhihu com question 20829671 answer 205421638 第一阶段 基于User Video图游历算法 2008年 1 在这个阶段 YouTube认为应该给用户推荐曾经观看过视频的同
  • 基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目 基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现 1 协同过滤的算法思想 1 1 基于内容的推荐中不足之处 基于内容的推荐方法用户易于理解 简单有效 但是它的缺点也十分明显
  • Spring Boot + Vue的网上商城之基于用户的协同过滤的商品推荐实现

    Spring Boot Vue的网上商城之基于协同过滤的商品推荐实现 协同过滤算法设计思路 构建用户 商品评分矩阵 将用户的购买行为和评价记录转化为一个用户 商品评分矩阵 矩阵中的每个元素表示用户对商品的评分 计算用户之间的相似度 通过计算
  • 毕业设计-基于大数据招聘岗位可视化系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 每日一题分享

    数字以 0123456789101112131415 的格式作为一个字符序列 在这个序列中第 2 位 从下标 0 开始计算 是 2 第 10 位是 1 第 13 位是 1 以此类题 请你输出第 n 位对应的数字 分析 0 9 共10个 10

随机推荐

  • 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    给你一个 非空 整数数组 nums 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 比如 nums 4 1 2 1 2 返回 4 法一思路 使用异或 由于相同的元素异或结果是0 0和任意元素异或都是该元素 所
  • 谈谈Spring中都用到了哪些设计模式?

    控制反转 IOC 和依赖注入 DI IoC Inversion of Control 控制翻转 是Spring 中一个非常非常重要的概念 它不是什么技术 而是一种解耦的设计思想 它的主要目的是借助于 第三方 即Spring 中的 IOC 容
  • 2023全国电子设计竞赛的一点思路

    2023电赛开始了 看了一下题目 有几个题有一点思路 分享给大家 不知道对不对 欢迎一起讨论 C题 电感电容测量装置 用数字电桥的方案 网上有开源的方案 可以找找 ADI有个集成芯片AD5933 是测量阻抗的 可以看看能不能用 参考 htt
  • 高防cdn和高防服务器有什么不一样?

    高防cdn 相信很多看过我们文章的小伙伴对cdn已经很了解了 cdn的原理很简单 就是构建在网络上的很多个节点 为网站作内容 分发 使用户就近获取所需资源 且分配的cdn节点都是高防节点 每个节点都有防御功能 还可以帮助用户隐藏真实ip 高
  • t-SNE数据降维(2维3维)及可视化

    最近看了一个叫光谱特征在后门攻击中的用法 读完之后发现是用了一个SVD也就是奇异值分解做了降维 然后用残差网络的representation层残差与残差的奇异值分解后的右奇异值矩阵的第一行做乘法得到correlation 疑惑得很什么时候相
  • 【CSS】如何设置行距、段落间距、缩进格式

    在使用MarkDownHere的时候 需要利用CSS编辑各个段落的格式 本文记录了CSS中编辑格式的各个属性及其设置 行距 行距一般使用line height value 来表示 比如要设置行距为2则可利用下面的属性 line height
  • M1(arm) Mac安装open3d

    问题 说在前面 open3d对arm架构的机器支持相对比较晚 所以目前还在完善当中 我试了官方给出的两种方法安装都出现了错误 首先给出官方的安装说明 Open3D ARM support 第一种 conda环境直接使用pip安装 即如下命令
  • python的概念及特点

    1 python语言 1 1 python语言的基本概念 python是一种极少数能兼具简单与功能强大的编程语言 官方介绍 python是一款易于学习且功能强大的编程语言 它具有高效率的数据结构 能够简单又有效地实现面象对象编程 pytho
  • 利用labelimg制作目标检测数据集

    labelimg介绍 Labelimg是一款开源的数据标注工具 可以标注三种格式 1 VOC标签格式 保存为xml文件 2 yolo标签格式 保存为txt文件 3 createML标签格式 保存为json格式 labelimg的安装 lab
  • Sublime Text 3 配置python 智能提示

    Sublime Text 3 配置python 智能提示 一 安装使用插件管理包 Package Control 安装教程参考地址 使用方法 安装成功后会显示出package control 点击package control 搜索 ins
  • mysql serial 类型_Mysql自增类型serial

    最近看前辈们的代码 发现了一个没有接触过的类型 serial 下面是关于serial的官方介绍 SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO INCREMENT UNIQUE SE
  • 使用扩展的ping和扩展的traceroute命令

    ping命令ping 信息包互联网探索程序 命令是排除设备的可及性的一个非常普通的方法故障 它使用二个互联网控制信息协议 ICMP 查询消息 ICMP响应请求和ICMP回音应答确定一台远端主机是否是活跃的 ping命令也测量用收到ECHO回
  • node.js+uni计算机毕设项目基于微信小程序的健康管理系统(程序+小程序+LW)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • [转]Ubuntu自带的FTP服务器vsftpd技巧

    实现了Apache多用户的虚拟主机设置 那么一般这些用户都会选择用ftp上传的方式来管理自己的web内容 这就需要我们再为他们开设FTP服务 Ubuntu自带的FTP服务器是vsftpd 1 安装vsftpd Ubuntu安装软件倒不是件困
  • ag-gride-vue滚动条调整

    v deep ag layout normal overflow y overlay v deep ag theme alpine dark hover ag body horizontal scroll viewport margin r
  • Matlab中使用latex风格

    Matlab绘图时使用latex风格的符号和字体 往往能够使你的图形增色不少 在Matlab中 title text xlabel ylabel和legend均可使用latex风格的符号和字体 多说无益 直接上例子 title E 2 t
  • php参考文献外文文献,web of science怎么导出参考文献

    web of science导出参考文献的方法 首先登录web of Science网站 选择文献 然后选中所需要的文献 点击页面上方中间 保存至Endnote online 旁边的下拉箭头 选择保存位置即可 本文操作环境 Windows7
  • 通过apply进行数据预处理

    数据准备 这里我事先下载了一个csv文件 其中包含两列 时间戳和字符串 大小为近8000行 使用apply进行预处理 apply可以批量的改变dataframe中的数据 经过上边的处理 在df中添加了一列 全部都是a 将A列改的值为大写 a
  • 写给Android开发者的性能优化指南(Android 性能优化的方面方面都在这儿)

    众所周知 一个好的产品 除了功能强大 好的性能也必不可少 有调查显示 近90 的受访者会因为APP性能差而卸载 性能也是造成APP用户沮丧的头号原因 而且随着产品的更新迭代 功能的越发复杂 UI页面的越发丰富 性能问题变得更加严重 说实话要
  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么