基于矩阵分解的推荐算法

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)

基于矩阵分解的推荐系统相关推荐

  1. 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统

    本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...

  2. 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐

    [ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...

  3. 基于矩阵分解的推荐算法,简单入门

    摘自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞 ...

  4. numpy 矩阵 秩_大规模电商推荐数据分析-基于矩阵分解的召回

    前面两篇文章回顾了我们团队做天池数据比赛<CIKM 2019 EComm AI:用户行为预测>的复赛方案,现在让我们的目光回到初赛.初赛数据组织和复赛一样,只是数据量差异较大.(初赛才2G ...

  5. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

  6. 分解原理_基于矩阵分解原理的推荐系统

    作者:Pytholabs 翻译:老齐 相关图书推荐:<跟老齐学Python:数据分析> 本书是数据科学.机器学习.深度学习等方向的入门读物,介绍了这些领域必用工具Numpy.Pandas和 ...

  7. 基于矩阵分解的协同过滤推荐

    基于矩阵分解的协同过滤推荐 Traditional SVD 通常SVD矩阵分解指的是SVD奇异值分解,我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: M m × n = ...

  8. 基于矩阵分解的CF算法实现(一):(Funk SVD)LFM

    基于矩阵分解的CF算法实现(一):LFM LFM也就是前面提到的Funk SVD矩阵分解 LFM原理解析 LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品 ...

  9. 基于矩阵分解的CF算法实现(二):BiasSvd

    基于矩阵分解的CF算法实现(二):BiasSvd BiasSvd其实就是前面提到的Funk SVD矩阵分解基础上加上了偏置项. BiasSvd 利用BiasSvd预测用户对物品的评分, k k k表示 ...

最新文章

  1. QT导入libcurl
  2. [Javascript]闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭
  3. [导入]常用26句生活用语[英语]
  4. 高级 Java 面试通关知识点整理
  5. Java性能调优:充分利用垃圾收集器
  6. Project中三种任务类型解释
  7. python qt5 增加文本框_Python用PyQt5制作弹出式输入框,Qt图形界面编程之QInputDialog...
  8. ETH基金会社区经理:以太坊改进流程EIP-1正在更新
  9. spring3.1.0 jar包详解说明
  10. verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
  11. ENVI中对图像监督分类结果的编辑
  12. scuba 报表_是否想了解JavaScript的for循环? 这个动画的SCUBA潜水员可以提供帮助!...
  13. android textview表情,android如何在textview或edittext上添加表情
  14. mt4的服务器在哪个文件,MT4服务器地址在哪个文件
  15. Google 以图搜图 - 相似图片搜索原理 - Java实现
  16. ios SnapKit 约束Unable to simultaneously satisfy constraints 和UIView-Encapsulated-Layout-Height的警告
  17. android 斑马进度条,bootstrap彩色斑马进度条
  18. 渗透测试工具之——启明天镜BS版本概述
  19. 今天创客的每一个创作都是未来变形金刚身上的一颗螺丝
  20. C++学生选修课程系统设计

热门文章

  1. Elasticsearch实战——全文检索架构设计
  2. 圈叉棋游戏c语言编写,圈叉棋小游戏的简单实现代码
  3. kingbase索引使用实践——sp-gist
  4. 活性氧Atractylenolide II,CAS No. 73069-14-4
  5. OA系统,让高效成为企业办公管理标配
  6. 《中国最强音》上海站抢鲜出炉
  7. 工厂模式三部曲之二_工厂模式
  8. Vue实现功能齐全的地图组件 - 附效果图及源码
  9. 皮卡皮卡:学习CSS的笔记
  10. transformers.generator_utils函数源码解析之sample生成(包括temperature、TopK、TopP函数解析)