当前位置:网站首页>[Spark]-协同过滤
[Spark]-协同过滤
2022-08-02 03:28:00 【Code_LT】
原理
如图 2(a) 所示,协同过滤算法找到用户可能喜欢的视频的方式很直观,就是利用用户的观看历史,找到跟目标用户 Joe 看过同样视频的相似用户,然后找到这些相似用户喜欢看的其他视频,推荐给目标用户 Joe。
矩阵分解算法则是期望为每一个用户和视频生成一个隐向量,将用户和视频定位到隐向量的表示空间上(如图 2(b) 所示),距离相近的用户和视频表明兴趣特点接近,在推荐过程中,我们就应该把距离相近的视频推荐给目标用户。例如,如果希望为图 2(b) 中的用户 Dave 推荐视频,我们可以找到离 Dave 的用户向量最近的两个视频向量,它们分别是《Ocean’s 11》和《The Lion King》,然后我们可以根据向量距离由近到远的顺序生成 Dave 的推荐列表。
那这个过程的关键就在于如何分解这个共现矩阵了。从形式上看,矩阵分解的过程是直观的,就是把一个 mxn 的共现矩阵,分解成一个 mxk 的用户矩阵和 kxn 的物品矩阵相乘的形式(如图 3)。
用户隐向量就是用户矩阵相应的行向量,而物品隐向量就是物品矩阵相应的列向量。
如何确定user举证和item矩阵的值?
用梯度下降法求解如下问题即可:
这个目标函数里面,rui 是共现矩阵里面用户 u 对物品 i 的评分,qi 是物品向量,pu 是用户向量,K 是所有用户评分物品的全体集合。通过目标函数的定义我们可以看到,我们要求的物品向量和用户向量,是希望让物品向量和用户向量之积跟原始的评分之差的平方尽量小。简单来说就是,我们希望用户矩阵和物品矩阵的乘积尽量接近原来的共现矩阵。
问题
如何决定向量维度k的值?
代码
// 建立矩阵分解模型
val als = new ALS()
.setMaxIter(5)
.setRegParam(0.01)
.setUserCol("userIdInt")
.setItemCol("movieIdInt")
.setRatingCol("ratingFloat")
//训练模型
val model = als.fit(training)
//得到物品向量和用户向量
model.itemFactors.show(10, truncate = false)
model.userFactors.show(10, truncate = false)
边栏推荐
- Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
- Go中的一些优化笔记,简约而不简单
- 一文理解分布式开发中的服务治理
- Windows下MySQL数据库报“ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:8000‘ (10061)”错误解决
- cmake安装到指定目录
- umi3 权限路由PrivateRoute未执行
- whistle 手机调试代理工具
- Go 程序太大了,能要个延迟初始化不?
- 2021-09-04 最简单的Golang定时器应用以及最简单的协程入门儿
- 修复APP的BUG,热修复的知识点和大厂的相关资料汇总
猜你喜欢
随机推荐
VS2017报错:LNK1120 1 个无法解析的外部命令
Binder机制详解(一)
Visual Studio2022创建setup项目
解密:链动2+1的商业模式
C# 常用方法记录
备战金九银十:Android 高级架构师的学习路线及面试题分享
ReentrantLock的使用和原理详解
Android-Kotlin anko库实现优雅跳转
Binder机制详解(三)
蓝桥杯:国二选手经验贴 附蓝桥杯历年真题
Flutter入门之网络请求篇
加密数字货币前传:从大卫·乔姆到中本聪
树莓派4b安装win11/10过程全教程(附蓝屏inaccessible boot device解决办法)
Kotlin - 标准函数(with、run和apply)
广告电商「私域打工人」职业前景:你离月薪6万,还差多远?
BSN:Boundary-Sensitive Network for Temporal Action Proposal Generation论文阅读笔记
laravel-admin FROM表单同行展示问题
自定义ViewGroup实现搜索栏历史记录流式布局
C# Form按ESC关闭窗体
Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset I3D论文精读