在推荐系统中,隐语义模型主要用来让模型自己去发掘物品之间潜在的特征。

  • 一、关于隐语义模型(LFM)
  • 二、LFM降维方法——矩阵因子分解
  • 三、LFM的进一步理解
  • 四、矩阵因子分解
  • 五、模型的求解——损失函数
  • 六、模型的求解算法——ALS(求得精确结果,但不适用,可忽略不看)
  • 七、梯度下降算法(实际使用)
  • 八、Python代码实例

代码链接: github.

一、关于隐语义模型(LFM)

1. 用隐语义模型来进行协同过滤的目标

  • 揭示隐藏的特征,这些特征能够解释为什么给出对应的预测评分
  • 这类特征可能是无法直接用语言解释描述的,事实上我们并不需要知道,类似"玄学”

2. 通过矩阵分解进行降维分析

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

3. 隐语义模型实例

  • 基于概率的隐语义分析( pLSA )
  • 隐式迪利克雷分布模型( LDA )
  • 矩阵因子分解模型(基于奇异值分解的模型, SVD )

二、LFM降维方法——矩阵因子分解

  • 假设用户物品评分矩阵为 R,现在有m个用户,n个物品
  • 我们想要发现 k个隐类,我们的任务就是找到两个矩阵P和Q,使这两个矩阵的乘积
    近似等于R,即将用户物品评分矩阵R分解成为两个低维矩阵相乘:


用户对电影的评分矩阵R分解为用户特征矩阵P跟电影特征矩阵Q(f1,f2,f3,f4为相应的特征):

反过来,用户特征矩阵P乘以电影特征矩阵Q得到用户的评分矩阵,其中用户评分矩阵R中的元素就是矩阵P与矩阵Q中相应特征向量的点积,反映的是用户特征与物品特征的契合程度,故R中数字越大反映用户对物品喜好程度越大。

三、LFM的进一步理解

  • 我们可以认为,用户之所以给电影打出这样的分数,是有内在原因的,我们可以挖掘出影响用户打分的隐藏因素,进而根据未评分电影与这些隐藏因素的关联度,决定此未评分电影的预测评分
  • 应该有一些隐藏的因素,影响用户的打分,比如电影:演员、题材、年代.甚至不一定是人直接可以理解的隐藏因子
  • 找到隐藏因子,可以对user和item进行关联(找到是由于什么使得user喜欢/不喜欢此item,什么会决定user喜欢/不喜欢此item),就可以推测用户是否会喜欢某一部未看过的电影
  • 对于用户看过的电影,会有相应的打分,但一个用户不可能看过所有电影,对于用户没有看过的电影是没有评分的,因此用户评分矩阵大部分项都是空的,是一个稀疏矩阵

  • 如果我们能够根据用户给已有电影的打分推测出用户会给没有看过的电影的打分,那么 就可以根据预测结果给用户推荐他可能打高分的电影

四、矩阵因子分解

  • 我们现在来做一个一般性的分析
  • 一个 m x n 的打分矩阵R可以用两个小矩阵Pmxk和Qkxn的乘积 R’ 来近似:


公式:

  • 得到Pmxk和Qkxn的乘积 R’ 不再是稀疏的,之前R’中没有的项也可以由P、Q的乘积算出,这就得到了一个预测评分矩阵
    注:R’ 代表上面公式中的矩阵乘积Rui,这么做是因为本人不会表示这个字符。。。233
  • 得到Pmxk和Qkxn的乘积 R’ 不再是稀疏的,之前R中没有的项也可以由P、Q的乘积算出,这就得到了一个预测评分矩阵

  • 如果得到的预测评分矩阵 R’ 与原评分矩阵R在已知评分位置上的值都近似,那么我们认 为它们在预测位置上的值也是近似的

五、模型的求解——损失函数

  • 现在的问题是,怎样得到这样的分解方式 R’=PxQ 呢?
  • 矩阵分解得到的预测评分矩阵 R’ ,与原评分矩阵R在已知的评分项.上可能会有误差,我们的目标是找到一个最好的分解方式,让分解之后的预测评分矩阵总误差最小

损失函数

  • 我们选择平方损失函数,并且加入正则化项,以防过拟合:


其中是正则化项,λ 一般通过交叉验证得到的

六、模型的求解算法——ALS(求得精确结果,但不适用,可忽略不看)

  • 现在,矩阵因子分解的问题已经转化成了一个标准的优化问题,需要求解P、Q,使目标损失函数取最小值
  • 最小化过程的求解,一般采用随机梯度下降算法或者交替最小二乘法来实现

1. 交替最小二乘法( Alternating Least Squares , ALS )

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

2. ALS算法

  • ALS算法具体过程如下:
    I. 为Q指定- -个初值Qo,可以是随机生成或者全局平均值
    II. 固定当前Qo值,求解P。
    I. 固定当前Po值,求解Q1
    IV. 固定当前Q1值,求解P1
    V. … (重复以。上过程)
    VI. 直到损失函数的值C收敛,迭代结束

3. 求解过程

  • 以固定Q,求解P为例
  • 由于每一个用户u都是相互独立的,当Q固定时,用户特征向量Pu应该取得的值与 其它用户特征向量无关;所以每一个Pu都可以单独求解
  • 优化目标可转化为

  • 那么我们的目标变成了:求每一个用户特征向量Pu,使得Lu(Pu)取得最小值

  • Lu对Pu求偏导:

  • ,可以得到:

  • 由Pu,Qi是向量,则:

  • 所以有

  • Qi是物品 i 的特征向量,所以等式可以写为:

  • 可以看到,物品特征向量构成的矩阵,其实就是Q:

  • 所以可以得到:

  • 解得:

  • 这样一一解出每一个Pu,就可以得到这一步的用户特征矩阵P了
  • 同样,下一次固定P时,可以解得

七、梯度下降算法(实际使用)

  • 由上可得,损失函数为:

  • 对于每一个Pu求偏导:

  • 梯度下降迭代:

  • 同理,有:

八、Python代码实例

为了便于理解,代码是基于Jupyter编辑器实现,每一个步骤有对应的输出结果。
代码链接: github.

  1. 引入依赖文件
import numpy as np
import pandas as pd
  1. 数据准备,自定义评分矩阵R
#评分矩阵R
R = np.array([[4,0,2,0,1],[0,0,2,3,1],[4,1,2,0,1],[4,1,2,5,1],[3,0,5,0,2],[1,0,3,0,4]])
  1. 算法实现
'''
@输入参数
R:M*N的评分矩阵
K:隐特征向量维度
max_iter:最大迭代次数
alpha:步长
lamda:正则化系数@输出
分解之后的P、Q
P:初始化用户特征矩阵M*k
Q:初始化物品特征矩阵N*K
'''#给定超参数K= 5
max_iter = 5000
alpha = 0.0002
lamda = 0.004#核心算法
def LFM_grad_desc(R,K,max_iter,alpha=0.0002,lamda = 0.002):#基本维度参数定义M = len(R)N = len(R[0])#P、Q初始值,随机生成P = np.random.rand(M,K)Q = np.random.rand(N,K)Q = Q.T#开始迭代for step in range(max_iter):#对所有的用户u、物品i做遍历,对应的特征向量Pu,Qi梯度下降for u in range(M):for i in range(N):#对于每一个大于0的评分,求出预测的评分误差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.001:breakreturn P,Q.T,cost
  1. 测试
P,Q,cost = LFM_grad_desc(R,K,max_iter,alpha,lamda)
'''
print(P)
print(Q)
print(cost)
print(R)
'''
predR = P.dot(Q.T)
#预测矩阵
predR

输出结果:

array([[3.94148951, 1.22116106, 2.07332208, 4.72376533, 0.91906299],
[2.67232719, 0.74839699, 1.98552529, 3.03276144, 0.97156313],
[3.9330541 , 0.94175409, 2.10780256, 4.09245595, 0.88109636],
[4.09412304, 1.05343721, 1.87535923, 4.92277698, 1.17325781],
[3.04067184, 1.03100579, 4.90618167, 3.34662411, 2.08753076],
[0.96925078, 0.10826894, 3.05169384, 3.81235739, 3.92397575]])

从输出的预测矩阵就可以看出,原先矩阵中为 0 的位置现在已经有了相应的预测值。

隐语义模型(Latent Factor Model, LFM)原理以及代码实现相关推荐

  1. Latent factor model, LFM

    目录 1. LFM算法概述 1.1 类别归属 1.2 用户对于各个类别的喜爱程度 1.3 LFM算法原理介绍 1.3.1 具体的例子介绍算法的思想 2. LFM算法应用场景 1. LFM算法概述 对于 ...

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

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

  3. 【推荐系统】隐语义模型(LFD)与矩阵分解(Matrix Factorization)

    如果需要完整代码可以关注下方公众号,后台回复"代码"即可获取,阿光期待着您的光临~ 文章目录 1.隐语义模型与矩阵分解 2.隐语义模型(Latent Factor Model) 3 ...

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

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

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

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

  6. 推荐系统算法—隐语义模型(LFM)详解

    文章目录 基本思想 数学原理 协同过滤算法主要包括基于用户的协同过滤(User-Based CF).基于物品的协同过滤(Item-Based CF).隐语义模型(Latent Factor Model ...

  7. 推荐系统(5)—隐语义模型(LFM)

    https://www.toutiao.com/a6663676280782717454/ 2019-03-02 14:27:17 基本概念 LFM(latent factor model)隐语义模型 ...

  8. python实现lfm_推荐系统之隐语义模型(LFM)

    一 基本概念 LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF有什么不同呢?这里可以做一个对比: 对于Use ...

  9. 【推荐系统(二)】协同过滤之隐语义模型(LFM)

    文章目录 一.引例 二.LFM 主要思想 训练样本构造 损失函数定义 参数学习 调参相关 三.小结 优点 缺点 基于用户行为分析的推荐算法一般称为协同过滤算法.所谓协同过滤,就是指众多的用户可以齐心协 ...

  10. 隐语义模型( LFM )

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

最新文章

  1. xml解析: dom4j
  2. 通俗易懂讲解RBF网络
  3. OpenFOAM流固耦合问题-FsiFoam(foam-extend-4.0)运行tutorials的bug修复
  4. 18个设计精美的旅游及酒店网站案例
  5. shmmax单位_kernel.shmmax ,kernel.shmmni 和kernel.shmall
  6. Python 第三方模块之 NumPy - 科学计算
  7. File Hunter for mac - 丢失文件查找AE脚本
  8. 进程线程协程对比(通俗)
  9. 【BZOJ1563】【NOI2009】—诗人小G(决策二分栈优化dp)
  10. D3 transtion
  11. php中用户自定义排序
  12. python 音频格式转换
  13. java (apache POI 组件) 操作 excel 插入批注
  14. html表格标题居于标题左侧,css如何设置表格标题(caption标签)的位置
  15. 阿里云国际站的对象存储oss与自建存储的区别
  16. 苹果或将为iPhone 13全系配备LiDAR
  17. camera调试名词及问题策略
  18. 屏幕录制和编辑神器ScreenFlow轻松上手
  19. 总结清楚浮动的几种方法
  20. ES6 之 Promise用法详解

热门文章

  1. 音乐频率的划分及播放器均衡器设置
  2. 分析入门股票量化交易券商接口的方法
  3. java分形_【Java之八】15分钟了解分形之朱利亚集
  4. mac分区后数据丢失怎么恢复?
  5. Unity商店下载的文件保存路径
  6. iPhone十年越狱史
  7. 软件安全需求、设计、测试【归纳】
  8. oracle数据库hiredate,数据库hiredate
  9. matlab 四元方程求解,如何用Matlab求解如下一元四次方程,求指导
  10. 灵雀云:etcd 集群运维实践