推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现

基于协同过滤的推荐一般分为基于近邻的推荐和基于模型的推荐,其中,基于近邻是指预测时直接使用用户已有的偏好数据,通过近邻数据来预测新物品的偏好。而基于模型的方法,是使用已知偏好数据来训练模型,找到内在规律,再用模型来做预测,类似于回归。

基于模型的方法,在训练时,可以基于标签内容来提取物品特征,可以让模型去发掘物品的潜在特征,这样的模型被称为隐语义模型(LFM)。

用隐语义模型进行协同过滤的目标:揭示隐藏的特征,这些特征解释为什么能给出预测的评分,这类特征可能无法直接用语言描述,但是我们知道有隐藏规律就可以。

协同过滤算法非常依赖历史数据,而一般的推荐系统中,偏好数据往往又是稀疏的,这就需要对原始数据做降维处理。一个大矩阵分解成两个矩阵相乘,分解之后的矩阵就代表用户和物品的潜在特征。

LFM降维方法:矩阵因子分解
假设用户的评分矩阵为R,现有m个用户,n个物品,我们要发现k个隐类,找到两个矩阵P和Q,使得两个矩阵的乘积近似等于R,即用户对物品的评分矩阵分解成了两个低维矩阵。
如下图所示,用户特征矩阵P的每一列都是用户的一个特征向量,电影特征矩阵Q的每一列都是物品的一个特征向量。

一个M×N的打分矩阵可以用两个矩阵P和Q的乘积来近似。

得到P和Q的乘积不再稀疏,之前的矩阵R也可以也可以由P和Q算出,这就得到了一个预测频分矩阵。

如果得到的预测评分矩阵于原来的评分矩阵在已知的评分位置上都近似,我们就可以认为预测位置上的值也是近似的。

模型的求解
现在得问题是怎样得到这样得分解方式P*Q呢,矩阵分解得到得预测矩阵与原评分矩阵在已知得评分项上可能有误差,我们得目标是找到一个最好得分解方式,让分解之后得预测评分矩阵总误差最小。

我们选取平方损失函数,并加入正则化项,防止过拟合

现在矩阵因子分解问题已经转换成了一个 标准得优化问题,需要求解P和Q使得目标损失函数取得最小值。

最小化求解得过程一般采用随机梯度下降法或者交替最小二乘法来实现。

交替最小二乘法(ALS):ALS得思想是由于两个矩阵P和Q都是未知,且通过矩阵乘法耦合到一起,为了使他们解耦 ,可以先固定Q,把P当作变量,通过损失函数最小化求出P,再反过来,固定P,把Q当作变量,求解处Q,如此交替执行,直到误差满足阈值条件或者达到迭代上限。


ALS具体求解过程:
以固定Q,求解P为例,由于每个用户u都是相互独立的,当Q固定的时候,用户特征向量Pu取得的值与其它用户特征向量无关,所以每个Pu都可以单独求解。

如下图所示,可以将u提出来,转换成一个等价的表达式。

那么令Lu(Pu)如下图所示,我们求其最小值即可。

我们对Pu求偏导,并令结果等于0,可得到如下表达式。

最终的化简过程如下所示:

我们主要还是学习用梯度下降的方法去求解隐语义模型。
梯度下降法也是损失函数求偏导,然后将偏导值乘以步长,带入梯度下降公式做迭代就可以。


#引入依赖
import numpy as np
import pandas as pd#数据准备
#评分矩阵R
R = np.array([[4, 0, 2, 0, 1],[0, 2, 3, 0, 0],[1, 0, 2, 4, 0],[5, 0, 0, 3, 1],[0, 0, 1, 5, 1],[0, 3, 2, 4, 1]])
'''
输入参数:
R:M×N的评分矩阵
K:隐特征向量的维度
max_iter:最大迭代次数
alpha:步长
lamda:正则化系数输出:
分解之后的P,Q
P:用户特征矩阵M*K
Q:物品特征矩阵N*K'''#给定超参数
K = 5 #维度设为5
max_iter =  5000
alpha = 0.0002
lamda = 0.004#核心算法
def lfm_grad_desc( R, max_iter,  lamda,  K, alpha):#基本维度参数定义M = len(R)N = len(R[0])#P与Q的初始值P = np.random.rand(M,K)Q = np.random.rand(N,K)Q = Q.T #Q矩阵的转置#开始迭代for step in range(max_iter):#对所有的用户u和物品i遍历,对应的特征向量Pu和Qi梯度下降for u in range(M):for i in range(N):#对于有评分的,求出预测评分误差if R[u][i] > 0:eui = np.dot(P[u,:], Q[:,i]) - R[u][i] #评分误差#带入公式,带入梯度下降算法更新当前的Pu和Qifor k in range(K):P[u][k] = P[u][k] - alpha  * (2 * eui * Q[k][i] + 2 * lamda * P[u][k])Q[k][i] = Q[k][i] - alpha  * (2 * eui * P[u][k] + 2 * lamda * Q[k][i])#u,i遍历完成,所有特征向量更新完成,可以得到P,Q,可以计算预测评分矩阵predR = np.dot(P, Q)#计算当前损失函数cost = 0for u in range(M):for i in range(N):if R[u][i] > 0:cost += (np.dot(P[u,:], Q[:,i]) - R[u][i]) ** 2#加上正则化项for k in range(K):cost += lamda * (P[u][k] ** 2 + Q[k][i] ** 2)if cost < 0.0001:breakreturn P ,  Q.T, costP, Q, cost = lfm_grad_desc(R, max_iter,  lamda,  K, alpha)
print(P)
print(Q)
print(cost)
print(R)
predR = P.dot(Q.T)
print(predR)

我们观察一下输出结果:
矩阵P为6行5列,矩阵Q为6行5列,列数5为维度
损失函数为0.567
最后两个矩阵为稀疏的原始评分矩阵和饱满的预测评分矩阵。

推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现相关推荐

  1. Python推荐系统学习笔记(1)基于协同过滤的个性化推荐算法实战---隐语义模型

    一.相关概念: 1.隐语义模型(LFM) 通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系. 假设我们想要发现 F 个隐类, 我们的任务就是找到两个矩阵 U 和 ...

  2. 模型算法_推荐算法之隐语义模型

    1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣     分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...

  3. 推荐算法之隐语义模型

    1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣     分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...

  4. 电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取

    文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...

  5. 隐语义模型LFM(Latent Factor Model)

    隐语义模型LFM(Latent Factor Model)是主题模型中的一种,跟其他主题模型一样,LFM也需要定义若干"主题",来表示个中隐含的关系,这些"主题" ...

  6. 隐语义模型( LFM )

    基于模型的协同过滤思想         ●基本思想                 -用户具有一定的特征,决定着他的偏好选择;                 -物品具有一定的特征,影响着用户需是否选 ...

  7. python实现lfm_【知识发现】隐语义模型(LFM,Latent Factor Model)推荐算法python实现

    1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...

  8. 【知识发现】隐语义模型LFM算法python实现(三)

    http://blog.csdn.net/fjssharpsword/article/details/78257126 基于上篇再优化. 1.回顾LFM原理,可以更好地理解代码 对于一个给定的用户行为 ...

  9. 【知识发现】隐语义模型LFM算法python实现(一)

    1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...

最新文章

  1. 利用 test 命令的测试功能
  2. 产品经理的四个重要阶段
  3. 基础练习 Huffuman树 (优先队列)
  4. es搜索热度属性_是不是场吊打局?奥迪A6L对比雷克萨斯ES
  5. 推荐eclipse插件Properties Editor
  6. 大众点评app 数据解密和反序列化
  7. Linux 关于查看 cpu 的命令
  8. 用 Mathematica 获取图片的 RGB 三基色
  9. python守护进程_让Python脚本成为守护进程
  10. uni-app 官网教程
  11. 【虚拟机】VMWare虚拟机中大小写切换失效的解决方法
  12. 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
  13. 【粤教版必修二《信息系统与社会》】知识总结与题目分析
  14. 租号服务器未响应,租号玩启动不了wegame
  15. 关于微信异常烦人自动生成的聊天记录截图视频
  16. Leetcode 500:键盘行
  17. 移动宽带连接电信服务器不稳定,移动宽带速度为啥与电信差距那么大?工信部官宣告诉你...
  18. Android应用CPU实时监控工具-全机型适用
  19. “强者恒强”,零食江湖来到新赛点
  20. openEuler操作系统的安装

热门文章

  1. C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快
  2. 报This application has no explicit mapping for /error, so you are seeing this as a fallback解决方法
  3. 焦虑真的好吗 过度的焦虑存在哪些影响
  4. 不卷不pua,早9晚6,这个招聘深得我心
  5. KMS激活部署以及客户端激活
  6. Exoplayer+Exomedia打造自定义视频播放器(一)
  7. CTF中(Crypto)常见的加密解密网站
  8. CF-Round#630 A-D
  9. es6简易教程(for react)
  10. Windows环境SwitchHosts的简单使用