基于矩阵分解的推荐系统
基于矩阵分解的推荐算法
1、概述
基于用户和基于项的协同过滤推荐算法,难以实现大数据量下的实时推荐。这时我们可以使用基于模型的协同过滤算法,矩阵分解(Matrix Factorization,MF)就是其中一种。
矩阵分解:将一个矩阵分解为两个或多个矩阵的乘积。mxn—>mxk X kxn
非负矩阵分解:一般的矩阵分解,分解的矩阵有正有负。很多实际应用中,负数没有意义,如文本等等。NMF中要求原矩阵和分解后矩阵都为非负矩阵,这个分解存在唯一。
基于模型的协同过滤算法:(1)建立模型;(2)利用训练好的模型进行推荐。
基于矩阵分解的推荐算法:(1)对用户商品矩阵分解;(2)利用分解后的矩阵预测原始矩阵中的未打分项。
2、基于矩阵分解的推荐算法
损失函数:将原始评分矩阵Rmxn分解后得到两个矩阵的乘积,这两个矩阵的乘积构建了新的评分矩阵,将非“-”元素,在原始和新的之间的误差的平方作为损失,我们需要求解所有非“-”项的损失之和的最小值。通常会加入正则化项。
损失函数求解:可使用梯度下降方法,求损失函数的负梯度,根据负梯度的方向更新变量(也就是分解后的各个矩阵的对应位置的元素)。目的是求得分解后的矩阵。
预测:得到分解的矩阵后,模型便建立好了。要为指定的用户i推荐其未打分的项,若要计算用户i对商品j的打分,k为分解矩阵的维度,。求得多个商品的打分后,进行降序排序。
3、利用矩阵分解进行推荐
首先导入数据并矩阵化;
然后利用梯度下降对矩阵分解得到模型(需要设置分解矩阵的维度k,学习率alpha,正则化参数beta,最大迭代次数maxCycles),输出分解后的矩阵p和q。
预测时,利用得到的分解矩阵p和q和前面的公式,可得到某用户user所有未打分商品的打分,然后排序输出。
# coding:UTF-8
import numpy as npdef load_data(path): #导入数据f = open(path)data = []for line in f.readlines():arr = []lines = line.strip().split("\t")for x in lines:if x != "-":arr.append(float(x))else:arr.append(float(0))data.append(arr)f.close()return np.mat(data)def gradAscent(dataMat, k, alpha, beta, maxCycles):#利用梯度下降法对矩阵进行分解m, n = np.shape(dataMat)# 1、初始化p和qp = np.mat(np.random.random((m, k)))q = np.mat(np.random.random((k, n)))for step in range(maxCycles):for i in range(m):for j in range(n):if dataMat[i, j] > 0:error = dataMat[i, j]for r in range(k):error = error - p[i, r] * q[r, j]for r in range(k):p[i, r] = p[i, r] + alpha * (2 * error * q[r, j] - beta * p[i, r])q[r, j] = q[r, j] + alpha * (2 * error * p[i, r] - beta * q[r, j])loss = 0.0for i in range(m):for j in range(n):if dataMat[i, j] > 0:error = 0.0for r in range(k):error = error + p[i, r] * q[r, j]loss = (dataMat[i, j] - error) * (dataMat[i, j] - error)for r in range(k):loss = loss + beta * (p[i, r] * p[i, r] + q[r, j] * q[r, j]) / 2if loss < 0.001:breakif step % 1000 == 0:print("\titer: ", step, " loss: ", loss)return p, qdef save_file(file_name, source):#保存结果f = open(file_name, "w")m, n = np.shape(source)for i in range(m):tmp = []for j in range(n):tmp.append(str(source[i, j]))f.write("\t".join(tmp) + "\n")f.close()def prediction(dataMatrix, p, q, user):#为用户user未互动的项打分n = np.shape(dataMatrix)[1]predict = {}for j in range(n):if dataMatrix[user, j] == 0:predict[j] = (p[user,] * q[:, j])[0, 0]return sorted(predict.items(), key=lambda d: d[1], reverse=True)def top_k(predict, k):#为用户推荐前k个商品top_recom = []len_result = len(predict)if k >= len_result:top_recom = predictelse:for i in range(k):top_recom.append(predict[i])return top_recomif __name__ == "__main__":# 1、导入用户商品矩阵print("----------- 1、load data -----------")dataMatrix = load_data("data.txt")# 2、利用梯度下降法对矩阵进行分解print("----------- 2、training -----------")p, q = gradAscent(dataMatrix, 5, 0.0002, 0.02, 5000)# 3、保存分解后的结果print("----------- 3、save decompose -----------")save_file("p", p)save_file("q", q)# 4、预测print("----------- 4、prediction -----------")predict = prediction(dataMatrix, p, q, 0)# 进行Top-K推荐print("----------- 5、top_k recommendation ------------")top_recom = top_k(predict, 2)print(top_recom)print(p * q)
基于矩阵分解的推荐系统相关推荐
- 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...
- 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐
[ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...
- 基于矩阵分解的推荐算法,简单入门
摘自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞 ...
- numpy 矩阵 秩_大规模电商推荐数据分析-基于矩阵分解的召回
前面两篇文章回顾了我们团队做天池数据比赛<CIKM 2019 EComm AI:用户行为预测>的复赛方案,现在让我们的目光回到初赛.初赛数据组织和复赛一样,只是数据量差异较大.(初赛才2G ...
- 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...
自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...
- 分解原理_基于矩阵分解原理的推荐系统
作者:Pytholabs 翻译:老齐 相关图书推荐:<跟老齐学Python:数据分析> 本书是数据科学.机器学习.深度学习等方向的入门读物,介绍了这些领域必用工具Numpy.Pandas和 ...
- 基于矩阵分解的协同过滤推荐
基于矩阵分解的协同过滤推荐 Traditional SVD 通常SVD矩阵分解指的是SVD奇异值分解,我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: M m × n = ...
- 基于矩阵分解的CF算法实现(一):(Funk SVD)LFM
基于矩阵分解的CF算法实现(一):LFM LFM也就是前面提到的Funk SVD矩阵分解 LFM原理解析 LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品 ...
- 基于矩阵分解的CF算法实现(二):BiasSvd
基于矩阵分解的CF算法实现(二):BiasSvd BiasSvd其实就是前面提到的Funk SVD矩阵分解基础上加上了偏置项. BiasSvd 利用BiasSvd预测用户对物品的评分, k k k表示 ...
最新文章
- QT导入libcurl
- [Javascript]闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭
- [导入]常用26句生活用语[英语]
- 高级 Java 面试通关知识点整理
- Java性能调优:充分利用垃圾收集器
- Project中三种任务类型解释
- python qt5 增加文本框_Python用PyQt5制作弹出式输入框,Qt图形界面编程之QInputDialog...
- ETH基金会社区经理:以太坊改进流程EIP-1正在更新
- spring3.1.0 jar包详解说明
- verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
- ENVI中对图像监督分类结果的编辑
- scuba 报表_是否想了解JavaScript的for循环? 这个动画的SCUBA潜水员可以提供帮助!...
- android textview表情,android如何在textview或edittext上添加表情
- mt4的服务器在哪个文件,MT4服务器地址在哪个文件
- Google 以图搜图 - 相似图片搜索原理 - Java实现
- ios SnapKit 约束Unable to simultaneously satisfy constraints 和UIView-Encapsulated-Layout-Height的警告
- android 斑马进度条,bootstrap彩色斑马进度条
- 渗透测试工具之——启明天镜BS版本概述
- 今天创客的每一个创作都是未来变形金刚身上的一颗螺丝
- C++学生选修课程系统设计
热门文章
- Elasticsearch实战——全文检索架构设计
- 圈叉棋游戏c语言编写,圈叉棋小游戏的简单实现代码
- kingbase索引使用实践——sp-gist
- 活性氧Atractylenolide II,CAS No. 73069-14-4
- OA系统,让高效成为企业办公管理标配
- 《中国最强音》上海站抢鲜出炉
- 工厂模式三部曲之二_工厂模式
- Vue实现功能齐全的地图组件 - 附效果图及源码
- 皮卡皮卡:学习CSS的笔记
- transformers.generator_utils函数源码解析之sample生成(包括temperature、TopK、TopP函数解析)