推荐系统|矩阵分解和FM:

文章目录

  • 推荐系统|矩阵分解和FM:
  • 1.核心思想
  • 2.基本原理
  • 3.编程实现

1.核心思想


矩阵分解模型其实就是在想办法基于这个评分矩阵去找到上面例子中的那两个矩阵, 也就是用户兴趣和物品的隐向量表达, 然后就把这个评分矩阵分解成Q和P两个矩阵乘积的形式, 这时候就可以基于这两个矩阵去预测某个用户对某个物品的评分了。 然后基于这个评分去进行推荐。这就是矩阵分解算法的原理。

2.基本原理


通过分解协同过滤的共现矩阵来得到用户和物品的隐向量

谈到矩阵分解, 最常用的方法是特征值分解(EVD)或者奇异值分解(SVD)。
(1)首先是EVD, 它要求分解的矩阵是方阵, 显然用户-物品矩阵不满足这个要求, 而传统的SVD分解, 会要求原始矩阵是稠密的, 而我们这里的这种矩阵一般情况下是非常稀疏的, 如果想用奇异值分解, 就必须对缺失的元素进行填充, 而一旦补全, 空间复杂度就会非常高, 且补的不一定对。 然后就是SVD分解计算复杂度非常高, 而我们的用户-物品矩阵非常大, 所以基本上无法使用。
(2)2006年的Netflix Prize之后, Simon Funk公布了一个矩阵分解算法叫做Funk-SVD, 后来被Netflix Prize的冠军Koren称为Latent Factor Model(LFM)。 Funk-SVD的思想很简单: 把求解上面两个矩阵的参数问题转换成一个最优化问题,可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵。

引入3个系数
1.训练集中所有记录的评分的全局平均数。在不同网站中,因为网站定位和销售物品不同, 网站的整体评分分布也会显示差异。比如有的网站中用户就喜欢打高分,有的网站中用户就喜欢打低分。而全局平均数可以表示网站本身对用户评分的影响。

2.用户偏差系数,可以使用用户 给出的所有评分的均值,也可以当做训练参数。这一项表示了用户的评分习惯中和物品没有关系的那种因素。比如有些用户比较苛刻,对什么东西要求很高,那么他评分就会偏低,而有些用户比较宽容, 对什么东西都觉得不错,那么评分就偏高

3.物品偏差系数,可以使用物品 收到的所有评分的均值,也可以当做训练参数。这一项表示了物品接受的评分中和用户没有关系的因素。比如有些物品本身质量就很高,因此获得的评分相对比较高,有的物品本身质量很差,因此获得的评分相对较低。

3.编程实现


1.首先,它会先初始化用户矩阵P和物品矩阵Q,P的维度是 [users_num, F] , Q的维度是 [item_nums, F],这个F是隐向量的维度。也就是把通过隐向量的方式把用户的兴趣和F的特点关联了起来。初始化这两个矩阵的方式很多,但根据经验,随机数需要和1/sqrt(F)成正比。下面代码中会发现。

2.有了两个矩阵之后,我就可以根据用户已经打分的数据去更新参数,这就是训练模型的过程,方法很简单,就是遍历用户,对于每个用户,遍历它打分的物品,这样就拿到了该用户和物品的隐向量,然后两者相乘加上偏置就是预测的评分,这时候与真实评分有个差距,根据上面的梯度下降就可以进行参数的更新。

这样训练完之后,我们就可以得到用户Alice和物品5的隐向量,根据这个就可以预测Alice对物品5的打分。下面的代码的逻辑就是上面这两步,这里使用带有偏置项和正则项的那个SVD算法

import math
import random
class SVD:def __init__(self,rating_data,F = 5,alpha = 0.1,lmbda = 0.1,max_iter = 100):# self.变量 好像可以将变量变为全局变量self.F = F        # 表示隐向量的维度self.P = dict()   # 用户矩阵P 大小是[users_num,F]self.Q = dict()   # 物品矩阵Q  大小是[item_num, F]self.bu = dict()  # 用户偏差系数self.bi = dict()  # 物品偏差系数self.mu = 0.0     # 全局平均数self.alpha = alpha # 学习率self.lmbda = lmbda # 正则项系数self.max_iter = max_iter         # 最大迭代次数self.rating_data = rating_data   # 评分矩阵'''初始化矩阵P和Q的方法很多,一般用随机数填充,但随机数的大小有讲究,根据经验,随机数需要和 1/sqrt(F)成正比'''cnt = 0  # 统计总的打分数,初始化mu用for user,items in self.rating_data.items():self.P[user] = [random.random() / math.sqrt(self.F) for x in range(0,F)]self.bu[user] = 0cnt += len(items)for item,rating in items.items():if item not in self.Q:self.Q[item] = [random.random() / math.sqrt(self.F) for x in range(0,F)]self.bi[item] = 0self.mu /= cnt'''有了矩阵之后,就可以进行训练,使用随机梯度下降的方法训练参数P和Q'''def train(self):for step in range(self.max_iter):for user,items in self.rating_data.items():for item,rui in items.items():rhat_ui = self.predict(user,item) # 得到预测评分# 计算误差e_ui = rui - rhat_uiself.bu[user] += self.alpha * (e_ui - self.lmbda * self.bu[user])self.bi[item] += self.alpha * (e_ui - self.lmbda * self.bi[item] )# 计算梯度下降更新梯度for k in range(0,self.F):self.P[user][k] += self.alpha * (e_ui*self.Q[item][k] - self.lmbda*self.P[user][k])self.Q[item][k] += self.alpha * (e_ui*self.P[user][k] - self.lmbda*self.P[item][k])self.alpha *= 0.1 # 每次迭代步长要逐步缩小'''预测user对item的评分,这里没有使用向量的形式'''def predict(self,user,item):# 计算所得评分 + 用户偏差系数 + 物品偏差系数 + 全局平均数return sum(self.P[user][f]*self.Q[item][f] for f in range(0,self.F)) + self.bu[user] + self.bi[item] + self.mu

# 采用字典的形式定义数据集,实际数据非常稀疏,因此使用字典形式而不是dataframe形式
def loadData():rating_data = {1:{'A':5,'B':3,'C':4,'D':4},2:{'A':3,'B':1,'C':2,'D':3,'E':3},3: {'A': 4, 'B': 3, 'C': 4, 'D': 3, 'E': 5},4: {'A': 3, 'B': 3, 'C': 1, 'D': 5, 'E': 4},5: {'A': 1, 'B': 5, 'C': 5, 'D': 2, 'E': 1}}return rating_data# 接下来是训练和预测
rating_data = loadData()
basi_svd = SVD(rating_data)
basi_svd.train()
for item in ['E']:print(item,basi_svd.predict(1,item))

Datawhale十月组队学习_推荐系统3相关推荐

  1. DataWhale NLP组队学习 Task5 基于深度学习的文本分类2

    文章目录 文本表示方法 Part3 词向量 TextCNN TextRNN 基于TextCNN.TextRNN的文本表示 TextCNN TextRNN 使用HAN用于文本分类 本章小结 本章作业 后 ...

  2. Datawhale 暑期组队学习计划

    Datawhale暑期组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类 难度系数分为低.中.高三档 可以按照需要参加 ...

  3. DataWhale数据分析组队学习——Day2

    DataWhale数据分析组队学习--Day2 引言 读取数据 数据预处理 总结 引言 今天是第二天,花了很多时间去搜索网页爬虫的资料,具体有几种方法,要考虑到从不同的网页抓取有不同的方法,一般用的方 ...

  4. Datawhale新春组队学习来了!

    Datawhale学习 贡献团队:Datawhale.开源学习联盟 本月组队学习,包含了AI专题和大数据两个方向,共4个学习内容. ⭐表示难度系数 开源学习联盟 相关高校学院.协会.实验室.社团等参与 ...

  5. 【组队学习】十月组队学习内容详情!(第30期)

    第30期 Datawhale 组队学习活动马上就要开始啦! 本次组队学习的内容为: 吃瓜教程--西瓜书+南瓜书 李宏毅机器学习(含深度学习) 深入浅出Pytorch 时间序列分析 机器学习数学基础 树 ...

  6. Datawhale 三月组队学习计划

    这次一共打算组织14个组队学习,涵盖了AI领域从理论知识到动手实践的内容,难度系数分为低.中.高档,可以按照需要参加哦 组队学习信息 1 /Python基础 课程设计:马晶敏,叶梁.许辉 组队学习说明 ...

  7. Datawhale组队学习周报(第003周)

    (一)当下 本周(03月01日~03月07日),我们组织的5门组队学习的课程中有3门已经结营,2门仍在进行中. 1. CV实践-布匹疵点智能识别(异常检测) 已经结营,优秀队长与优秀学习者如下: 2. ...

  8. Datawhale组队学习周报(第002周)

    Datawhale组队学习周报(第002周) (一)当下 本周(02月22日~02月28日),我们正在进行5门开源内容的组队学习.一共建立了6个学习群,参与人数1080人.到目前为止,有4门课开源内容 ...

  9. python编程语言的优缺点_组队学习优秀作业 | Python的发展历史及其前景

    ↑↑↑关注后"星标"BioPython每日干货 & 每月组队学习,不错过BioPython学习 开源贡献: BioPython团队 创始人 Guido van Rossum ...

最新文章

  1. 中国消费者信息指数影响因素分析
  2. UE4链接第三方库(lib和dll)
  3. VBscript.Encode 解码器
  4. Java 多线程常见问题
  5. 他35k月薪,如何扛住redis面试!
  6. 添加RPMfusion仓库
  7. Ubuntu 18.04 LTS安装crossover类虚拟机平台
  8. 基于CarMaker的C-NCAP主动安全系统试验仿真(二)
  9. python mql4跟单_MT4软件本地跟单方法的实现 -
  10. AOP核心概念,连接点(JoinPoint)切入点(Pointcut)通知(Advice)通知类切面(Aspect)
  11. 语音识别/合成开源项目
  12. 初创公司怎么设置股权结构?
  13. 基于多尺度稀疏表示的视网膜OCT图像阴影修复
  14. 【QCM2150】WCN3680 WFA 11ac STA 5.2.1/5.2.61测试失败
  15. 在 JavaScript 中访问对象属性的 3 种方法
  16. 安装Nvidia显卡驱动和CUDA
  17. 最新python与SEO实战课程第2期项目实战(完整)
  18. 普元BPS启动报错BPS Process Server startup failed,because of the UpGradeManager program
  19. L2-007 家庭房产分数 25作者 陈越单位 浙江大学
  20. 日本最省女孩15年买下3套房的启示

热门文章

  1. Po.et正式推出为出版商打造的API层应用—Frost
  2. 实时时钟DS1302实验
  3. excel实现join功能
  4. UE4制作多语言游戏(本地化功能详解)
  5. eplan php文件夹,EPLAN P8 导入部件库的方法-mdb文件
  6. PWM脉冲matlab正弦波调制,(最新整理)单相正弦波PWM逆变电路
  7. c语言运算符优先级结合,C语言运算符优先级及结合性
  8. EXCEL+方方格子中的翻译工具+百度翻译=实现批量翻译
  9. 谓语动词语态和时态相结合
  10. 情感分析-英文电影评论