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

news2024/11/20 10:18:13

目录

  • 协同过滤
  • 基于用户的协同过滤
    • 背后的思想
    • 原理
    • 实践
      • 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.coloradmin.cn/o/1798595.html

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

相关文章

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

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

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…

减调食谱攻略:美味低卡又健康

早餐主要求质&#xff0c;也就是求营养&#xff0c;更确切的说是“均衡的营养&#xff0c;多重的营养元素”确保每天早餐不重样就差不多了。 早餐主食&#xff1a;蛋羹、糖心水煮蛋&#xff0c;皮蛋瘦肉粥、南瓜粥、小米粥&#xff0c;蒸煮玉米、南瓜、芋头、红薯&#xff0c;…

深度神经网络——什么是深度强化学习?

除了无监督机器学习和监督学习之外&#xff0c;人工智能创造的另一种常见形式是强化学习。除了常规的强化学习之外&#xff0c; 深度强化学习 由于它结合了深度学习和强化学习的最佳方面&#xff0c;因此可以带来令人惊讶的令人印象深刻的结果。让我们具体看看深度强化学习是如…

李廉洋:6.6黄金原油怎么看?今日行情分析及最新策略。

黄金消息面分析&#xff1a;美指走强未能抑制金价升势。黄金价格大幅上涨&#xff0c;在美国公布喜忧参半的经济数据后&#xff0c;金价与周二的走势发生180度大转弯&#xff0c;这些数据可能保证美联储设定的借贷成本降低。美国10年期基准国债收益率下跌3个基点&#xff0c;至…

项目进度管理必备:15款最佳项目进度跟踪工具推荐

15好用的款主流项目进度管理软件&#xff1a;PingCode、Worktile、Trello、Tower、Asana、Smartsheet、Teambition、ClickUp、Wrike、Monday.com、Notion、禅道、飞书、云效、蓝凌。 严格的进度管理有助于更好地控制项目进展&#xff0c;提升团队效率&#xff0c;最终实现项目成…

Android音频进阶之1.0到14.0音频焦点变化(七十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

小白学linux | 使用正则表达式审计ssh登录ip地址

Ubuntu /var/log/auth.log记录了所有与身份验证相关的事件&#xff0c;包括SSH登录尝试 grep -i "failed password" /var/log/auth.log | \awk {if($11 ~/^[0-9]\.[0-9]\.[0-9]\.[0-9]$/)print $11 ; else print $13} | \uniq -c | sort -nr -k1 RedHat系发行版 /va…

MK米客方德 SD NAND与文件系统:技术解析与应用指南

随着数字存储技术的飞速发展&#xff0c;SD NAND(贴片式T卡&#xff09;已成为我们日常生活中不可或缺的存储工具。我们将深入探讨SD NAND的文件系统&#xff0c;特别是SD 3.0协议支持的文件系统类型&#xff0c;以及它们在实际应用中的作用和用户可能遇到的问题。 MK米客方德的…

微前端之旅:探索Qiankun的实践经验

theme: devui-blue 什么是微前端&#xff1f; 微前端是一种前端架构方法&#xff0c;它借鉴了微服务的架构理念&#xff0c;将一个庞大的前端应用拆分为多个独立灵活的小型应用&#xff0c;每个应用都可以独立开发、独立运行、独立部署&#xff0c;再将这些小型应用联合为一个完…

[pixi.js] 入门简单案例 简易时钟

老实说pixi虽然之前拿来做个几个简单的游戏&#xff0c;但是是好久前的了&#xff0c;又忘了&#xff0c;现在算是重新入门。 官网版本已经更新到v8去了&#xff0c;而react相关的pixi库pixi-react 虽然支持react18 但还是v6-v7的版本&#xff0c;既然已经看了v8的文档&#xf…

解决富文本中抖音视频无法播放的问题——403

问题 富文本中的抖音视频无法播放&#xff0c;资源状态码是403禁止访问打开控制台&#xff0c;可以看到在项目中打开&#xff0c;数据请求的请求头多了一个Referer: http://localhost:3000/而复制链接在新窗口直接打开&#xff0c;请求头中并不会携带Referer 解决方案 在ind…

书客护眼大路灯Sun再次引领先锋,守护青少年视力健康!

在这个信息化高速发展的时代&#xff0c;我们的眼睛承受着前所未有的压力。每年的护眼日&#xff0c;不仅是提醒我们关注眼睛健康的时刻&#xff0c;更是全社会共同努力&#xff0c;为青少年营造健康用眼环境的契机。 “守护明亮视界&#xff0c;预防近视从我做起”。随着国内青…

【Vue2源码学习分析】

# 文件结构 源码目录 # 调试环境搭建 安装依赖: npm i安装rollup: npm i -g rollup修改dev脚本&#xff0c;添加sourcemap&#xff0c;package.json "dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:web- full-dev",运行开发命令…

SkyWalking之P0业务场景输出调用链路应用

延伸扩展&#xff1a;XX业务场景 路由标签打标、传播、检索 链路标签染色与传播 SW: SkyWalking的简写 用户请求携带HTTP头信息X-sw8-correlation “X-sw8-correlation: key1value1,key2value2,key3value3” 网关侧读取解析HTTP头信息X-sw8-correlation&#xff0c;然后通过SW…

Linux网络编程:网络层协议|IP

目录 前言&#xff1a; 1.IP协议 1.1.IP协议格式 1.2.网段划分 1.2.1.知识引入 1.2.2.IP地址划分和子网掩码 1.3.IP地址分类 1.3.1.特殊IP地址 ​编辑 1.3.2.私有IP和公网IP 1.3.3.浅谈NAT技术 1.4.路由 1.4.1.什么是路由 1.4.2.路由表 1.5.网络层数据切片和组装…

Allegro导入DXF文件

阿里狗导入DXF文件 点击File–>Import–>DXF&#xff0c;注意DXF file那边不能使用中文路径和文件名以及非法字符&#xff0c;DXF units一般为mm&#xff0c;结构那边一般都用mm制作图&#xff0c;右边三个选项只需要勾选中间那个&#xff0c;意思是以增加的形式导入&am…

jail管理器CBSD实践@FreeBSD

CBSD介绍 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案的单一集成工具&#xff0c;用于使用预定义的软件集以最少的配置快速构建和部署计算机虚拟环境。 虽然CBSD没有提供额外的操作系统级功能&#xff0c;但它极大地简化了…

Codeforces Round 951 (Div. 2) F. Kostyanych‘s Theorem(思维题 交互好题)

题目 交互题&#xff0c;n&#xff08;n<1e5&#xff09;个点的完全图&#xff0c;无向的&#xff0c;初始恰好删了n-2条边 每次询问可以输入一个d&#xff1a;? d 交互器会输出一个当前度>d的点v&#xff0c; 如果有多个这样的点&#xff0c;输出度最小的&#xff…

搭建自己的DNS服务器

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…