当前位置:网站首页>[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)
边栏推荐
- 自定义view实现半圆弧进度条
- 元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
- Laravel 的关联模型 及其 预加载多个关联 with使用方法
- Binder机制详解(三)
- 如何在正则表达式里表达可能存在也可能不存在的内容?
- Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
- php laravel框架生成二维码
- 【萌新解题】斐波那契数列
- Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx
- uniapp发布到微信小程序:分包、删减代码全过程
猜你喜欢
随机推荐
Glide使用及原理分析
Win10 解决AMD平台下SVM无法开启的问题
账务处理程序、记账凭证账务处理程序、汇总记账凭证账务处理程序、科目汇总表账务处理程序、会计信息化概述、信息化环境下会计账务处理的基本要求(此章出1道小题)
深度学习理论:model.fit 函数参数详解
PHP hash加密与解密
解决composer安装太慢 更换国内镜像
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
快速搭建一个网关服务,动态路由、鉴权的流程,看完秒会(含流程图)
Debian 12 Bookworm 尝鲜记
Transformer结构解析及常见问题
centos8 安装搭建php环境
Kotlin - 延迟初始化和密封类
自定义ViewGroup实现搜索栏历史记录流式布局
浅谈性能优化:APP的启动流程分析与优化
2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
View与ViewGroup
备战金九银十:Android 高级架构师的学习路线及面试题分享
面试知识点整理:Skia 架构的场景渲染
zsh: command not found: xxx 解决方法
Laravel 的关联模型 及其 预加载多个关联 with使用方法