推荐系统三十六式学习笔记:原理篇.近邻推荐07|人以群分,你是什么人就看到什么世界

目录

  • 协同过滤
  • 基于用户的协同过滤
    • 背后的思想
    • 原理
    • 实践
      • 1、构造矩阵
      • 2、相似度计算
      • 3、推荐计算
      • 4、一些改进
  • 应用场景:
  • 总结

谈及推荐系统,不得不说大名鼎鼎的协同过滤。协同过滤的重点在于协同,所谓协同,也就是群体互帮互助,互相支持是群体智慧的体现,协同过滤也是这般简单直接,历久弥新。

协同过滤

当你的推荐系统过了只能使用基于内容的推荐阶段后,就有了可观的用户行为了。这时候的用户行为通常是正向的,也就是用户或明或暗地表达着喜欢的行为。这些行为可以表达成一个用户和物品的关系矩阵,或是网络,或是图,本质是一个东西。

这个用户物品关系矩阵中填充的就是用户对物品的态度,但并不是每个位置都有,需要的就是把那些还没有的地方填充起来。这个关系矩阵是协同过滤的关键,一切都围绕它来进行;

协同过滤是一个比较大的算法范畴。通常划分为两类;
1、基于记忆的协同过滤(Memory-Based)
2、基于模型的协同过滤(Model-Based)

基于记忆的协同过滤,就是记住每个人消费过什么东西,然后推荐相似的东西,或者推荐相似的人消费的东西。基于模型的协同过滤则是从用户物品关系矩阵中去学习一个模型,从而把那些矩阵空白处填满;

今天先讲一下基于基于的协同过滤的一种:基于用户,或者叫做User-Based;

基于用户的协同过滤

背后的思想

你有没有过这种感觉,你遇到一个人,你发现你喜欢的书,他也喜欢,你喜欢的音乐,他也在听,你喜欢看的电影,他也至少看了两三遍,你们这叫什么,志同道合。所以问题来了,他又看了一本书,又听了一首歌,你会不会正好也喜欢呢?

这个感觉非常的自然,这就是基于用户的协同过滤背后的思想。详细来说就是:先根据历史消费行为帮你找到一群和你口味相似的用户,然后根据这些和你很相似的用户消费了什么新的、你没见过的物品、都可以推荐给你。

这就是我们常说的物以类聚人以群分,你是什么人,你就会遇到什么人。

这其实也是一个用户聚类的过程,把用户按照兴趣口味聚类成不同的群体,给用户产生的推荐就来自这个群体的平均值;所以要做好这个推荐,关键是如何量化口味相似这个指标。

原理

我们来说一下基于用户的协同过滤具体是怎么做的,核心是那个用户物品的关系矩阵,这个矩阵是最原始的材料。

第一步,准备用户向量,从这个矩阵中,理论上可以给每一个用户得到一个向量 。为什么说要是理论上呢?因为得到向量的前提是:用户需要在我们产品里有行为数据,否则就得不到这个向量。

这个向量有这么三个特点:
1、向量的维度就是物品的个数;
2、向量是稀疏的,也就是说并不是每个位置都有值;
3、向量维度上的取值可以是简单的0或1,1表示喜欢过,0表示没有;

第二步,用每一个用户的向量,两两计算用户之间的相似度,设定一个相似度阈值,为每个用户保留与其最相似的用户。

第三步,为每一个用户产生推荐结果。
把和他相似的用户们喜欢过的物品汇总起来,去掉用户自己已经消费过的物品,剩下的排序输出就是推荐结果。

在这里插入图片描述

这个公式,等号左边就是计算一个物品i和一个用户u的匹配分数,等号右边是这个分数的计算过程,分母是把用户u相似的n个用户的相似度累加起来分子是把这n个用户各自对物品i的态度,按照相似度加权求和。这里的态度最简单就是0或1,1表示喜欢过,0表示没有,如果是评分,则可以是0到5的取值。整个公式就是相似用户们的态度加权平均值。

实践

原理看上去很简单,但是在实现上却有一些坑,需要非常小心;
1、只有原始的用户行为日志,需要从中构造矩阵,怎么做?
2、如果用户的向量很长,计算一个相似度则耗时很久,怎么办?
3、如果用户量很大,而且通常如此,而且两两计算用户相似度也是一个大坑,怎么办?
4、在计算推荐时,看上去要为每一个用户计算他和每一个物品的分数,又是一个大坑,怎么办?

1、构造矩阵

我们在做协同过滤计算时,所用的矩阵是稀疏的,也就是说很多矩阵元素不用存,都是0,这里介绍典型的稀疏矩阵存储格式。
1.CSR:这个存储稍微复杂点,是一个整体编码方式。它有三个组成:数值,列号和行偏移共同编码。COO
2.COO:这个存储方式很简单,每个元素由三元组表示(行号,列号,数值),只存储有值的元素,缺失值不存储。
这些存储格式,在常见的计算框架里面都是标准的,如Spark中,Python的Numpy包中。把你的原始行为日志转换为上述的格式,就可以使用常用的计算框架的标准输入了。

2、相似度计算

相似度计算是个问题。
首先是单个相似度计算问题,如果碰上向量很长,无论什么相似度计算方法,都要遍历向量。所以通常下降相似度计算复杂度的办法有两种。

1、对向量采样计算。如果两个100维向量的相似度是0.7,我们牺牲一些精度,随机从取出10维计算,以得到的值作为其相似度值,虽然精度下降,但执行效率明显快了很多。这个算法由Twitter提出,叫做DIMSUM算法,已经在spark中实现了。

2、向量化计算,与其说是一个技巧,不如说是一种思维。在机器学习领域,向量之间的计算时家常便饭,现代的线性代数库都支持直接的向量计算,比循环快很多。一些常用的向量库都天然支持,比如python中的numpy库。

其次的问题就是,如果用户量很大,两两之间计算代价很大。

有两个办法来缓解这个问题:
第一个办法是:将相似度拆成Map Reduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积,Reduce阶段对这些乘积再求和,map reduce任务结束后再对这些值归一化;

第二个办法是:不用基于用户的协同过滤。
这种计算对象两两之间的相似度的任务,如果数据量不大,而且矩阵还是稀疏的,有很多工具可以使用:比如KGraph 、GraphCHI等;

3、推荐计算

得到用户之间的相似度之后,接下来就是计算推荐分数。显然未每一个用户计算每一个物品的推荐分数,这个代价有点大。不过,有几点我们可以来利用一下:
1.只有相似用户喜欢过的物品才需要计算,这样就减少很多物品量。
2、把计算过程拆成Map Reduce 任务。

拆Map Reduce任务的做法是:
1、遍历每个用户喜欢的用户列表;
2、获取该用户的相似用户列表;
3、把每一个喜欢的物品Map成两个记录发射出去,一个键为<相似用户ID,物品ID,1>三元组,值为<相似度>,另一个键为<相似用户ID,物品ID,0>三元组,值为<喜欢程度相似度>,其中1和0是为了区分两者,会在最后一步中用到。
4、Reduce阶段,求和后输出;
5、<相似用户ID,物品ID,0>的值除以<相似用户ID,物品ID,1>的值

因为map过程,其实就是将原来耦合的计算过程解耦了,这样的话我们可以利用多线程技术实现Map效果。

4、一些改进

对于基于用户的协同过滤有一些常用的改进办法,改进主要集中在用户对物品的喜欢程度上:
1.惩罚对热门物品的喜欢程度,这是因为热门的东西很难反应出用户的真实兴趣,更可能是被煽动,或者无聊随便点击的情形,这是群体行为的常见特点。
2.增加喜欢程度的时间衰减,一般使用一个指数函数,指数是一个负数,值和喜欢行为发生时间间隔正相关即可,比如 e ( − x ) e^{(-x)} e(x),x代表喜欢时间距今的时间间隔。

应用场景:

最后说一下基于用户的协同过滤有哪些应用场景。基于用户的协同过滤有两个产出:

1、相似用户列表
2、基于用户的推荐结果

所以,我们不仅可以推荐物品,还可以推荐用户,比如我们在一些社交平台看到的,相似粉丝、和你口味类似的人等等都可以这样计算。
对于这个方法计算出来的推荐结果本身,由于是基于口味计算得出,所以在更强调个人隐私场景中应用更佳,在这样的场景下,不受大v影响,更能反应真实的兴趣群体。

总结

今天,我与你聊了基于用户的协同过滤方法,也顺便普及了一下协同过滤这个大框架的思想。基于用户的协同过滤算法非常简单,但非常有效。

在实现这个方法时,有许多需要注意的地方,比如:
1、相似度计算本身如果遇到超大维度向量怎么办?
2、两两计算用户相似度遇到用户量很大时怎么办?

同时,我也聊到了如何改进这个推荐算法,希望能够帮到你。

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

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

相关文章

初级软件测试快速入门

文章目录 初级软件测试-测试用例、缺陷报告的认识与使用软件测试简介测试分类模型质量模型测试模型 用例编写的八大要素用例设计方法缺陷 初级软件测试-测试用例、缺陷报告的认识与使用 软件测试简介 什么是软件测试&#xff1f; 使用技术手段验证软件是否满足需求 主流技能 …

《数学学习与研究》杂志是什么级别?知网收录吗?评职认可吗?

《数学学习与研究》杂志是什么级别&#xff1f;知网收录吗&#xff1f;评职认可吗&#xff1f; 《数学学习与研究》是由东北师范大学主管&#xff0c;吉林省数学会与东北师范大学出版社联合主办的省级优秀数学类期刊杂志。该杂志为半月刊&#xff0c;国际标准刊号为 ISSN1007-…

图解通用网络IO底层原理、Socket、epoll、用户态内核态······

LInux 操作系统中断 什么是系统中断 这个没啥可说的&#xff0c;大家都知道&#xff1b; CPU 在执行任务途中接收到中断请求&#xff0c;需要保存现场后去处理中断请求&#xff01;保存现场称为中断处理程序&#xff01;处理中断请求也就是唤醒对应的任务进程来持有CPU进行需要…

《大宅门》特别活动走进李良济,开启探寻中医药文化之旅!

《大宅门》话剧将于6月14-16日在苏州湾大剧院上演&#xff0c;为了让大家了解到中医药知识&#xff0c;6月2日&#xff0c;李良济携手苏州湾大剧院举办《大宅门》特别活动“探寻中医药文化之旅”&#xff01; 6月2日下午&#xff0c;大家一起走进李良济&#xff0c;深度了解传统…

小白必学!场外期权的交易模式

场外期权的交易模式 随着金融市场的深化与创新&#xff0c;场外期权交易作为一种灵活多样的金融衍生品交易方式&#xff0c;正逐渐成为投资者关注的焦点。场外期权&#xff0c;顾名思义&#xff0c;是在非交易所市场进行的期权交易&#xff0c;与交易所期权有着显著的区别。那…

Promed Bioscience—高纯度胶原蛋白

Promed Bioscience——高纯度胶原蛋白供应商 专于研发&#xff0c;忠于质量&#xff0c;创新驱动 AXXORA 作为Enzo life sciences公司的子公司&#xff0c;是欧美最大的生命科学研究信息、服务、销售电子一站式服务平台之一&#xff0c;AXXORA精选欧洲四十多家优秀的生命科学研…

Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head

安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

JAVA-LeetCode 热题-第24题:两两交换链表中的节点

思路&#xff1a; 定义三个指针&#xff0c;其中一个临时指针&#xff0c;进行交换两个节点的值&#xff0c;重新给临时指针赋值&#xff0c;移动链表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

docker部署fastdfs

我的镜像包地址 链接&#xff1a;https://pan.baidu.com/s/1j5E5O1xdyQVfJhsOevXvYg?pwdhcav 提取码&#xff1a;hcav docker load -i gofast.tar.gz拉取gofast docker pull sjqzhang/go-fastdfs启动gofast docker run -d --name fastdfs -p 8080:8080 -v /opt/lijia/lijia…

antd vue a-select 搜索

数据结构 list: [{ name: "序号", id: 0, show: true },{ name: "出库单编号", id: 1, show: false },{ name: "wbs元素", id: 2, show: true },{ name: "序号1", id: 3, show: true },{ name: "出库单编号1", id: 4, show…

如何从小米手机传输文件到电脑? [5个简单的方法]

与苹果设备间的AirDrop或iTunes等工具相比&#xff0c;Android手机到PC的文件传输似乎不那么便捷。但小米用户有多种应用&#xff0c;如Mi PC Suite和ShareMe&#xff0c;可以高效地进行传输。本文将介绍5种将小米设备文件传输到PC的方法&#xff0c;包括使用和不使用USB线的情…

深度学习_02_卷积神经网络循环神经网络

卷积神经网络 1. 卷积神经网络 神经元存在局部感受区域----感受野 . 第一个卷积神经网络雏形----新认知机 缺点&#xff1a;没有反向传播算法更新权值&#xff0c;模型性能有限 第一个大规模商用卷积神经网络----Lenet-5 缺点&#xff1a;没有大量数据和高性能计算资源。 第一个…

图解 React diff 算法

Render 阶段会生成 Fiber Tree&#xff0c;所谓的 diff 实际上就是发生在这个阶段&#xff0c;这里的 diff 指的是 current FiberNode 和 JSX 对象之间进行对比&#xff0c;然后生成新的的 wip FiberNode。 除了 React 以外&#xff0c;其他使用到了虚拟 DOM 的前端框架也会有类…

Kafka之Producer原理

1. 生产者发送消息源码分析 public class SimpleProducer {public static void main(String[] args) {Properties prosnew Properties();pros.put("bootstrap.servers","192.168.8.144:9092,192.168.8.145:9092,192.168.8.146:9092"); // pros.pu…

26-LINUX--I/O复用-select

一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符&#xff0c;对提高程序的性能有很大帮助。以下情况适用于I/O复用技术&#xff1a; ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…

使用 Django 构建动态网页

文章目录 创建 Django 项目和应用程序创建 HTML 模板创建视图函数配置 URL 路由运行 Django 服务器使用 Django 模板语言 Django 是一个流行的 Python Web 框架&#xff0c;它能够帮助开发人员快速构建强大的 Web 应用程序。在 Django 中&#xff0c;HTML 是用于呈现网页内容的…

1. 计算机系统概述

1. 计算机系统概述 文章目录 1. 计算机系统概述1.1 计算机的发展硬件的发展软件的发展 1.2.1 计算机硬件的基本组成早期冯诺依曼的结构现代计算机的结构 1.2.2 各个硬件的工作原理主存储器运算器控制器计算机工作过程 1.2.3 计算机系统的多级层次结构1.3 计算机的性能指标存储器…

GD32如何配置中断优先级分组以及中断优先级

使用GD32 MCU的过程中&#xff0c;大家可能会有以下疑问&#xff1a;中断优先级如何配置和使用&#xff1f; 本文将会为大家解析中断优先级分组以及中断优先级的配置使用&#xff1a; 中断优先级分组配置 一个GD32 MCU系统需要大家明确系统中使用的中断优先级分组&#xff0…

代驾公司在市场竞争中如何保持优势?

在竞争激烈的市场中&#xff0c;代驾公司可以通过多种策略保持其竞争优势&#xff0c;包括利用市场潜力、创新服务模式、提高服务效率以及加强品牌建设等。以下是具体的策略&#xff1a; 利用市场潜力 汽车产业空间巨大&#xff1a;随着汽车保有量的增加&#xff0c;代驾行业…