基于用户的协同过滤算法(userCF)

2023-11-10

1.定义

userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。
基于用户的协同过滤算法主要包括两个步骤:

2.第一步:找到和目标用户兴趣相似的用户集合。

利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。那么,我们可以通过如下的Jaccard公式简单地计算u和v的兴趣相似度:
在这里插入图片描述
或者通过余弦相似度计算:
在这里插入图片描述
以下图用户行为记录为例,举例说明UserCF计算用户兴趣相似度的例子。在该例中,用户A对物品{a, b, d}有过行为,用户B对物品{a, c}有过行为,利用余弦相似度公式计算用户A和用户B的兴趣相似度为:
在这里插入图片描述
同理,我们可以计算出用户A和用户C、 D的相似度:
在这里插入图片描述
这种方式对两两用户都利用余弦相似度计算相似度。这种方法的时间复杂度是O(|U|*|U|),这在用户数很大时非常耗时。事实上,很多用户相互之间并没有对同样的物品产生过行为,即相似度为0。这种方式将很多时间浪费在了计算这种用户之间的相似度上,换一个思路,可以首先计算出 ∣ N ( u ) ⋂ N ( v ) ∣ ≠ 0 |N(u)\bigcap N(v)|\neq0 N(u)N(v)=0的用户对 ( u , v ) (u,v) (u,v),然后再对这种情况除以分母 ∣ N ( u ) ∣ ∣ N ( v ) ∣ \sqrt{|N(u)||N(v)|} N(u)N(v) 。为此,可以首先建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。
以下图的用户行为为例。首先,需要建立物品—用户的倒排表,然后,建立一个4×4的用户相似度矩阵W,对于物品a,将W[A][B]和W[B][A]加1,对于物品b,将W[A][C]和W[C][A]加1,以此类推。扫描完所有物品后,我们可以得到最终的W矩阵。这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。
在这里插入图片描述

3.第二步:找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

得到用户之间的兴趣相似度后, UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:
在这里插入图片描述
其中, S(u, K)包含和用户u兴趣最接近的K个用户, N(i)是对物品i有过行为的用户集合, w u v w_{uv} wuv是用户u和用户v的兴趣相似度, r v i r_{vi} rvi 代表用户v对物品i的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的 r v i r_{vi} rvi=1。
因此可以给倒排序图中的用户A进行推荐。选取K=3,用户A对物品c、 e没有过行为,因此可以把这两个物品推荐给用户A。根据UserCF算法,用户A对物品c、 e的兴趣是:
在这里插入图片描述
从而我们在实际的操作中,就可以根据最后得到的p,推荐给用户rank前N的物品。

4.用户相似度计算的改进

用户兴趣相似度的最简单的公式(余弦相似度公式)过于粗糙,以图书为例,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似,因为绝大多数中国人小时候都买过《新华字典》。但如果两个用户都买过《数据挖掘导论》,那可以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
根据用户行为计算用户的兴趣相似度:
在这里插入图片描述
该公式通过 1 log ⁡ 1 + ∣ N ( i ) ∣ \frac{1}{\log1+|N(i)|} log1+N(i)1惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。

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

基于用户的协同过滤算法(userCF) 的相关文章

  • 利用ScheduledThreadPoolExecutor定时执行任务

    最近时间好忙 终于抽出时间来写一篇博客了 想了想 把之前遇到的一个小bug分享一下吧 之前在做时钟插件时候 我用到了一个定时器 即大家常用的TimerTask 但它总是意外的停止 就是我开启了一个定时器 每一秒都会走run方法 有时候定时器
  • AD 每次更新PCB时,总有一个元件被删除,再添加

    问题如标题所述 在网上找到几种方法 试过最终可行方法如下 在原理图中双击出问题的元件 弹出窗口中点Reset按钮 改一下该元件的Unique ID 然后再更新PCB 就不会出现这样情况了 出错的元件 每个都要改一下
  • 2021非常全的接口测试面试题及参考答案

    一 前言 接口测试最近几年被炒的火热了 越来越多的测试同行意识到接口测试的重要性 接口测试为什么会如此重要呢 主要是平常的功能点点点 大家水平都一样 是个人都能点 面试时候如果问你平常在公司怎么测试的 你除了说点点点 还能说什么呢 无非就是

随机推荐

  • 精品,阿里P8爆款《SpringBoot+vue全栈开发实战项目》笔记太香了,先睹为快

    前言 Spring 作为一个轻量级的容器 在JavaEE开发中得到了广泛的应用 但是Spring 的配置繁琐臃肿 在和各种第三方框架进行整合时代码量都非常大 并且整合的代码大多是重复的 为了使开发者能够快速上手Spring 利用Spring
  • 交互计算-eval,input,print,range,join,map

    描述 编写一个简单的交互计算机 输入表达式 给出结果 eval 函数 eval 允许将任何字符串评估为Python表达式 这是个非常强大的功能 因为它允许在运行时动态生成和执行代码 它可以接受任意表达式 例如 gt gt gt eval
  • sql not in 查询结果为空解决

    使用下列sql语句进行查询时 发现出来的结果为0 select count distinct id from result where date 20221205 and us id xxx and id not in select dis
  • 简单介绍一下c++正则表达式

    目录 1 正则表达式的需求 1 1普通字符 1 2特殊字符 1 3限定字符 2 std regex极其相关 2 1regex match 2 2regex replace and regex search 3 常用的regex 3 1检验数
  • mysql5.7版本没有over()函数

    mysql5 7版本没有over 函数 两个小时血的教训
  • 入侵检测与数字取证-期末复习

    ids复习 idshwk1 alert tcp any any gt any 8080 flags A content I 20 am 20 IDS 20 Homework 20 I offset 99 depth 101 msg TEST
  • Python实现寻找二叉树中最近的公共祖先

    Python实现寻找二叉树中最近的公共祖先 在二叉树中 我们可以定义节点的父节点为其直接连接上层节点的边 无法访问父节点信息的情况下如何获取两个节点的最低公共祖先呢 我们可以采用递归遍历二叉树的方式进行查找 首先 我们需要定义一个函数来检查
  • 【AntDB数据库】AntDB数据库迁移(二)

    导出导入数据 导出数据 编写配置文件 ora2pg 导出数据的配置文件如下 cat gt shcrm so1 data conf lt lt EOF ORACLE HOME home postgres oracle instantclien
  • 短视频剪辑如何赚钱

    你的问题可真多哈 给你把浓缩一下 就是如何通过短视频赚钱 下面分享一下我的经验 毕竟也做了好几年的自媒体 现在主要做抖音和快手 1 首先回答你第一个问题 短视频剪辑一个月能转多少钱的问题 这个问题肯定没有标准答案 不同人 做不同的视频类型
  • 编译Linux内核时出现“ncurses-devel”错误

    通常在安装完Linux系统后 在编译kernel使用make menuconfig时 可能会出现如下错误 Unable to find the ncurses libraries or the required header files m
  • fedora 27 安装 android studio

    Reference Fedora wiki Android Studio Fedora23 安装Android Studio 在fedora下进行Android studio 安装和前期配置 Android Studio 为Android
  • Python字典的操作小技巧——索引、增添、删除、修改与取键和值

    字典是非常常用的一种数据结构 它与json格式的数据非常相似 核心就是以键值对的形式存储数据 关于Python中的字典做如下四点说明 构造字典对象需要使用大括号表示 即 每一个字典元素都是以键值对的形式存在 并且键值对之间用英文状态下的冒号
  • linux如何复制文件夹和

    CP命令 格式 CP 选项 源文件或目录 目的文件或目录 选项说明 b 同名 备分原来的文件 f 强制覆盖同名文件 r 按递归方式保留原目录结构复制文件 cp r tmp a root a 记得有空格 1 vi filename 打开或新建
  • 【C++】类的前置声明

    两个类要互相引用 就会出现 未定义 尴尬 此时可以用前置声明来解决 class person 类的前置声明 class Animal public void eat person pn class person public friend
  • Qt串口接收一帧不完整问题

    1 串口通信接收不全问题 在触发接收后 调用一次waitForReadyRead 等待100ms 后续再readAll 目前都能完整接收一帧 connect m serialPort SIGNAL readyRead this SLOT r
  • xcode中如何显示文件后缀

    xcode14 3 用不惯mac电脑真恶心 改个显示文件后缀找半天 1 首先双击打开xcode软件 2 此时 电脑左上角出现xcode字样 左上角如果看不到xcode字样 再次点击xcode软件弹出来就有了 鼠标右键它 点击setting或
  • 安装zookeeper详解教程(windows单机版)(以及解决方法)

    1 下载安装包 Apache官网下载 我选的比较稳定的旧版本 地址 Apache ZooKeeperhttps zookeeper apache org releases html 2 解压到本地目录 3 配置文件 进入conf目录下将zo
  • A. Doremy‘s IQ(贪心)

    Problem A Codeforces 题意 一个人的IQ为q 有n场比赛 第i天只能参加第i场比赛 如果比赛难度大于IQ 那么IQ就会下降 如果IQ为0就不能参加比赛了 问最多能参加多少场比赛 输入一个01串 0表示不参加 1表示参加
  • 【nlp-with-transformers】

    今天社群中的小伙伴面试遇到了一个问题 如何保证生成式语言模型在同样的输入情况下可以保证同样的输出 这里面造成问题的因素有两个方面 一个方面是在forward过程中参数的计算出现了差异 这种情况一般发生在游戏显卡中 游戏显卡无法保证每一次底层
  • 基于用户的协同过滤算法(userCF)

    1 定义 userCF 当一个用户A需要个性化推荐时 可以先找到和他有相似兴趣的其他用户 然后把那些用户喜欢的 而用户A没有听说过的物品推荐给A 这种方法称为基于用户的协同过滤算法 基于用户的协同过滤算法主要包括两个步骤 2 第一步 找到和