推荐系统-基于物品的协同过滤(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) 的相关文章

  • user-cf的理解-初衷

    使用user cf的初衷 以前的推荐算法 往往是基于内容标签的推荐 比如 用户喜欢了 数据挖掘导论 这本书 而这本书有 数据挖掘 这个标签 那么就给这个用户推荐 其他的 数据挖掘 类的图书 标签就像媒介一样 即是物品 即item 的属性 又
  • 协同过滤(Collaborative Filtering):UserCF and Item CF

    具体的学习资料可以参考王喆老师的 深度学习推荐系统 已经梳理好了知识体系 我也将按照这个路线再次梳理一遍 同时做一些拓展和加深理解 一 前言 系统过滤曾是多年前推荐系统领域的应用最广泛的模型 也是基石一样的存在 重要 重要 这里推出两篇论文
  • 毕业设计-基于大数据的电影推荐系统-python

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

    同学们好 这里是海浪学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难
  • 进制转换方法

    常用计算机各进制的含义和相互之间的简单转换方法 文章目录 常用计算机各进制的含义和相互之间的简单转换方法 一 理解进制含义 1 二进制 2 八进制 3 十进制 4 十六进制 二 进制之间转换 1 1二进制转十进制 1 2十进制转二进制 除法
  • CTR预估的几种方式

    1 CTR预估 CTR预估是计算广告中最核心的算法之一 那么CTR预估是指什么呢 简单来说 CTR预估是对每次广告的点击情况做出预测 预测用户是点击还是不点击 具体定义可以参考 CTR CTR预估和很多因素相关 比如历史点击率 广告位置 时
  • FM算法解析及Python实现

    1 什么是FM FM即Factorization Machine 因子分解机 2 为什么需要FM 1 特征组合是许多机器学习建模过程中遇到的问题 如果对特征直接建模 很有可能会忽略掉特征与特征之间的关联信息 因此 可以通过构建新的交叉特征这
  • 计算物品的相似度矩阵

    计算物品的相似度矩阵 例如现在有A B C D四个用户 分别对a b c d e五个物品表达了自己喜好程度 通过评分高低来表现自己的偏好程度高低 计算物品之间的相似度矩阵 算法 1 建立用户物品倒排表 A a b d B a c e C b
  • 【推荐算法】MMoE模型:Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts

    1 MMoE背景 MMoE是谷歌在2018年发表在KDD上的一篇基于多任务学习的经典论文 其使用场景是对不相关任务的多任务学习 在推荐系统中 这些不相关的任务可以示例为 视频流推荐中的CTR 时长 点赞 分享 收藏 评论等相关性不强的多个任
  • 数学建模写作模板及排版经验(超全)

    开篇福利分享 链接 https pan baidu com s 10hJMmLw8pQ5r3csnnySH g pwd msy3 提取码 msy3 论文是建模中最后的一环也是最关键的一环 这环做好了那就圆满了 做砸了全功尽弃 了 关于怎么写
  • 推荐算法实战项目:物品协同过滤算法(ItemCF)原理以及案例实战(附完整 Python 代码)

    协同过滤 collaborative filtering 是一种在推荐系统中广泛使用的技术 该技术通过分析用户或者事物之间的相似性 来预测用户可能感兴趣的内容并将此内容推荐给用户 这里的相似性可以是人口特征的相似性 也可以是历史浏览内容的相
  • 协同过滤推荐算法实例代码

    什么是协同过滤 协同过滤是利用集体智慧的一个典型方法 要理解什么是协同过滤 Collaborative Filtering 简称 CF 首先想一个简单的问题 如果你现在想看个电影 但你不知道具体看哪部 你会怎么做 大部分的人会问问周围的朋友
  • Pytorch中的torch.nn.Linear()方法的详解

    torch nn Linear 作为深度学习中最简单的线性变换方法 其主要作用是对输入数据应用线性转换 先来看一下官方的解释及介绍 class Linear Module r Applies a linear transformation
  • 推荐算法:基于内容的推荐_1:内容推荐算法

    基于内容的推荐 推荐给用户他们过去喜欢的类似产品 基于CF的推荐 识别出具有相同爱好的用户 给他们推产品 基于内容的推荐算法 基于内容推荐的步骤 对数据内容分析 得到物品的结构化描述 分析用户过去的评分或评论过的物品的 作为用户的训练样本
  • 个人总结:推荐算法篇(附协同过滤等) 综述

    现代推荐系统 对于在线部分来说 一般要经历几个阶段 首先通过召回环节 将给用户推荐的物品降到千以下规模 因为在具备一定规模的公司里 是百万到千万级别 甚至上亿 所以对于每一个用户 如果对于千万级别物品都使用先进的模型挨个进行排序打分 明显速
  • 大数据Hadoop学习之————基于物品的协同过滤算法实现物品推荐

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

    Sequential Recommendation with Graph Neural Networks 文章目录 1 背景 2 模型 2 1 Interest Graph Construction 2 1 1 Raw graph cons
  • Spring Boot + Vue的网上商城之基于用户的协同过滤的商品推荐实现

    Spring Boot Vue的网上商城之基于协同过滤的商品推荐实现 协同过滤算法设计思路 构建用户 商品评分矩阵 将用户的购买行为和评价记录转化为一个用户 商品评分矩阵 矩阵中的每个元素表示用户对商品的评分 计算用户之间的相似度 通过计算
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • 基于Item的协同过滤算法实践(最简单的在线电影推荐系统)

    上一篇文章 基于用户的协同过滤算法实践 中 基于用户的相似度生成推荐列表 本文将基于Item的相似度阐述 1 相似度 基于物品的协同过滤算法 简称ItemCF 给用户推荐那些和他们之前喜欢的物品相似的物品 不过ItemCF不是利用物品的内容

随机推荐

  • 给你一个 非空 整数数组 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就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么