隐语义模型(LFM)-----------电影推荐算法
隐语义模型(LFM)
- LFM 降维方法 —— 矩阵因子分解
- LFM 的进一步理解
- 矩阵因子分解
- 模型的求解算法——ALS
- ALS算法具体过程如下:
- 算法实现代码如下:
- 用隐语义模型来进行协同过滤的目标
- 揭示隐藏的特征,这些特征能够解释为什么给出对应的预测评分
- 这类特征可能是无法直接用语言解释描述的,事实上我们并不需要知道,类似“玄学”
- 通过矩阵分解进行降维分析
- 协同过滤算法非常依赖历史数据,而一般的推荐系统中,偏好数据又往往是稀疏的;这就需要对原始数据做降维处理
- 分解之后的矩阵,就代表了用户和物品的隐藏特征
- 隐语义模型的实例
- 基于概率的隐语义分析(pLSA)
- 隐式迪利克雷分布模型(LDA)
- 矩阵因子分解模型(基于奇异值分解的模型,SVD)
LFM 降维方法 —— 矩阵因子分解
- 假如用户物品评分矩阵为 R,现在有 m 个用户,n 个物品
- 我们想要发现 k 个隐类,我们的任务就是找到两个矩阵 P 和 Q,使这两个矩阵的乘积近似等于 R,即将用户物品评分矩阵 R 分解成为两个低维矩阵相乘:
Rm×n^=Pm×kT⋅Qk×k≈R\hat{R_{m\times n}} = P_{m\times k}^{T}\cdot Q_{k\times k} \approx R Rm×n^=Pm×kT⋅Qk×k≈R
LFM 的进一步理解
- 我们可以认为,用户之所以给电影打出这样的分数,是有内在原因的,我们可以挖掘出影响用户打分的隐藏因素,进而根据未评价电影与这些隐藏因素的关联度,决定此未评价电影的预测评分
- 应该有一些隐藏的因素,影响用户的打分,比如电影:演员、题材、年代… 甚至不一定是人直接可以理解的隐藏因子
- 找到隐藏因子,可以对 user 和 item 进行关联(找到是由于什么使得 user 喜欢/不喜欢此 item,什么会决定 user 喜欢/不喜欢此 item),就可以推测用户是否会喜欢某一部未看过的电影
- 对于用户看过的电影,会有相应的打分,但一个用户不可能看过所有电影,对于用户没有看过的电影是没有评分的,因此用户评分矩阵大部分项都是空的,是一个稀疏矩阵
`Movie1 Movie2 Movie3 Movie4 user1 1 2 user2 5 1 user3 2 0 user4 4 2 user5 1 2 user6 3 5 user7 5 1 user8 1 0 user9 2 3
`
- 如果我们能够根据用户已有电影的打分推测出用户会给没有看过的电影的打分,那么就可以根据预测结果给用户推荐他可能打高分的电影
矩阵因子分解
- 我们现在来做一个一般性的分析
- 一个m×nm\times nm×n 的打分矩阵 R 可以用两个小矩阵 Pm×nP_{m\times n}Pm×n 和 Qk×nQ_{k\times n}Qk×n 的乘积 R^\hat{R}R^ 来近似:
Rui^=PuT⋅Qi=∑k=1KPuk⋅Qki\hat{R_{ui}} = P_{u}^{T}\cdot Q_{i}= \sum_{k=1}^{K}P_{uk}\cdot Q_{ki} Rui^=PuT⋅Qi=k=1∑KPuk⋅Qki - 得到 Pm×kP_{m\times k}Pm×k 和 Qk×nQ_{k\times n}Qk×n 的乘积 R^\hat{R}R^ 不再是稀疏矩阵的,之前 R 中没有的项也可以由 P、Q 的乘积算出,这就得到了一个 预测评分矩阵
`Movie1 Movie2 Movie3 Movie4 user1 1 4 2 5 user2 3 5 1 1 user3 2 4 0 5 user4 1 4 0 2 user5 1 3 2 1 user6 3 1 2 5 user7 5 1 1 2 user8 2 1 0 0 user9 2 2 3 4
`
- 如果得到的预测评分矩阵 R^\hat{R}R^ 与原评分矩阵 R 在已知评分位置上的值都近似,那么我们认为它们在预测位置上的值也是近似的
模型的求解算法——ALS
ALS算法具体过程如下:
- 1、为 Q 指定一个初值 Q0Q_{0}Q0,可以是 随机生成或者全局平均值
- 2、固定当前 Q0Q_{0}Q0值,求解 P0P_{0}P0
- 3、固定当前 P0P_{0}P0值,求解 Q1Q_{1}Q1
- 4、固定当前 Q1Q_{1}Q1值,求解 P1P_{1}P1
- 5、……(重复以上过程)
- 6、直到损失函数的值 C 收敛,迭代结束
算法实现代码如下:
- 1、LFM(隐语义模型)梯度下降算法实现
- 1.1、引入依赖
import numpy as np import pandas as pd
- 1.2、数据准备
# 评分矩阵 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],])
- 1.3、算法实现
""" @输入参数: R:M*N 的评分矩阵 K:隐特征向量维度 max_iter:最大迭代次数 alpha:步长 lambada:正则化系数@%输出: 分解之后的 P,Q P:初始化用户特征矩阵 M*K Q:初始化物品特征矩阵 N*K """# 给定超参数 K = 5 max_iter = 5000 alpha = 0.0002 lambada = 0.004# 核心算法 def LFM_grad_desc(R, K=2, max_iter=1000, alpha=0.0001, lambada=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):# 对所有的用户 user、物品 item 做遍历,对应的特征向量 Pu、Qi梯度下降for user in range(M):for item in range(N):# 对于每一个大于 0 的评分,求出预测评分误差if R[user][item] > 0:eui = np.dot(P[user, :], Q[:, item]) - R[user][item]# 代入公式,按照梯度下降算法更新当前的 Pu、Qifor k in range(K):P[user][k] = P[user][k] - alpha * (2 * eui * Q[k][item] + 2 * lambada * P[user][k])Q[k][item] = Q[k][item] - alpha * (2 * eui * P[user][k] + 2 * lambada * Q[k][item])# user、item 遍历完成,所有特征向量更新完成,可以得到 P、Q,可以计算预测评分矩阵predR = np.dot(P, Q)# 计算当前损失函数cost = 0for user in range(M):for item in range(N):if R[user][item] > 0:cost += (np.dot(P[user, :], Q[:, item]) - R[user][item]) ** 2# 加上正则化项for k in range(K):cost += lambada * (P[user][k] ** 2 + Q[k][item] ** 2)if cost < 0.0001:break return P, Q.T, cost
- 1.4、测试
P, Q, cost = LFM_grad_desc(R, K, max_iter, alpha, lambada)print(P) print(Q) print(cost)print(R) preR = P.dot(Q.T) preR
[[ 0.77647888 0.63447284 0.80512534 0.55895106 0.96240798][ 1.32550446 0.88331475 0.62267974 0.02980579 0.7550383 ][ 1.03659297 0.93987934 0.72430912 -0.22346398 -0.4749907 ][ 0.77301525 0.49679317 0.57141146 0.693392 1.60075878][ 0.57612612 0.63976908 1.49718539 0.77990291 -0.03548665][ 0.50209193 0.92510101 0.89396375 0.69306917 1.07528177]] [[ 0.85738419 0.73837126 0.69663037 1.09029338 1.75496549][ 0.07742206 0.60860856 1.0905473 0.54186881 0.92432084][ 1.25494006 0.96409017 -0.01302121 -0.32074926 0.63812769][ 1.2074824 1.52394386 1.92146259 0.53896068 -0.09707023][ 0.05525611 0.37630539 0.54292178 -0.10977234 0.30147462]] 0.5609786914291215 [[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]] array([[3.99350543, 2.51674135, 2.01049581, 3.65933526, 0.94756504],[3.58002164, 2.03332638, 2.97916634, 4.08587363, 0.96805775],[1.01008047, 0.88203516, 1.96613029, 4.00139316, 0.68553548],[4.99292856, 2.84069443, 2.24068429, 3.00675796, 0.94636437],[2.79737849, 2.45652931, 1.04750538, 4.97120172, 0.98912751],[4.37904712, 2.94626505, 1.97420123, 4.00294624, 1.10930686]])
隐语义模型(LFM)-----------电影推荐算法相关推荐
- 基于隐语义模型的个性化推荐算法综述-笔记整理
1. 前期知识 均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation) 1.均方根值(RMS)也称作为效值,它的计算方法是先平方.再平均.然后开方. 2.均方根误 ...
- 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现
推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现 基于协同过滤的推荐一般分为基于近邻的推荐和基于模型的推荐,其中,基于近邻是指预测时直接使用用户已有的偏好数据,通过近邻数据来预测新物品的偏好.而 ...
- 隐语义模型( LFM )
基于模型的协同过滤思想 ●基本思想 -用户具有一定的特征,决定着他的偏好选择; -物品具有一定的特征,影响着用户需是否选 ...
- 隐语义模型LFM(Latent Factor Model)
隐语义模型LFM(Latent Factor Model)是主题模型中的一种,跟其他主题模型一样,LFM也需要定义若干"主题",来表示个中隐含的关系,这些"主题" ...
- python实现lfm_【知识发现】隐语义模型(LFM,Latent Factor Model)推荐算法python实现
1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示 物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示 用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...
- 【知识发现】隐语义模型LFM算法python实现(三)
http://blog.csdn.net/fjssharpsword/article/details/78257126 基于上篇再优化. 1.回顾LFM原理,可以更好地理解代码 对于一个给定的用户行为 ...
- 【知识发现】隐语义模型LFM算法python实现(一)
1.隐语义模型: 物品:表示为长度为k的向量q(每个分量都表示 物品具有某个特征的程度) 用户兴趣:表示为长度为k的向量p(每个分量都表示 用户对某个特征的喜好程度) 用户u对物品i的兴趣可以表示 ...
- 推荐系统(5)—隐语义模型(LFM)
https://www.toutiao.com/a6663676280782717454/ 2019-03-02 14:27:17 基本概念 LFM(latent factor model)隐语义模型 ...
- python实现lfm_推荐系统之隐语义模型(LFM)
一 基本概念 LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF有什么不同呢?这里可以做一个对比: 对于Use ...
- 【知识发现】隐语义模型LFM算法python实现(二)
http://blog.csdn.net/fjssharpsword/article/details/78015956 基于该篇文章中的代码优化,主要是在生成负样例上提高执行速度,代码参考如下: # ...
最新文章
- 在装有Ubuntu16.04的VMware虚拟机下安装OpenCV3.2.0
- 聊聊flink的CheckpointScheduler
- python 多维数组删除重复
- IDEA2021.3无法创建测试类解决方法
- Visual Studio 2017 15.9 版本发布:推出全新的导入 / 导出配置功能
- 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】
- Weekly Contest 141
- [詹兴致矩阵论习题参考解答]习题1.10
- python 安装容易吗,Python安装的步骤操作其实是件很容易的事
- SQL Server商业智能功能–创建简单的OLAP多维数据集
- 图像和视频语义分割的深度学习技术综述
- es数据定时清理_elasticsearch索引自动清理
- 小米手机qq邮箱收件服务器,小米手机无法添加邮箱?是你不会设置而已
- Matlab基础部分第一章 MATLAB概述第二章MATLAB基础知识
- Docker部署服务(二)上传镜像至Habor
- 去除IE自带的输入框清除按钮
- 第一章 银联8583报文解析
- 端口扫描程序设计c语言,主机端口扫描程序设计.doc
- 赵小楼《天道》《遥远的救世主》深度解析(118)女人的客观就那么难么?不难。难的是不想客观的人。
- SQL Server 教程
热门文章
- JAVA将证件号打星号
- 卡尔曼滤波代码JAVA_卡尔曼滤波视觉跟踪源代码及效果视频
- NR LDPC 04 -definition, Tanner and Protograph Constructions
- 卷不动了?300 秒快速了解 Java 9 - 16 新特性,助你脱离内卷
- matlab sae模型,深度学习笔记(三):SAE模型
- mkdir -p的用法
- 首选DNS服务器地址不显示,首选dns服务器如何设置?如何设置DNS地址
- oracle 8103错误,【数据恢复】详解ORA-8103错误
- python中对象的概念
- 吴恩达《深度学习》笔记汇总