本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞赛上面,前段时间的百度电影推荐最终结果的前10名貌似都是把矩阵分解作为一个单模型,最后各种ensemble,不知道正在进行的阿里推荐比赛( http://102.alibaba.com/competition/addDiscovery/index.htm),会不会惊喜出现。。。。好了,闲话不扯了,本文打算写一篇该类型推荐算法的入门篇
目录
一,基于矩阵分解的推荐算法相关理论介绍
二,C++代码实现
三,总结跟展望一下
四,后续计划
一,基于矩阵分解的推荐算法相关理论介绍
我们知道,要做推荐系统,最基本的一个数据就是,用户-物品的评分矩阵,如下图1所示
图1
矩阵中,描述了5个用户(U1,U2,U3,U4 ,U5)对4个物品(D1,D2,D3,D4)的评分(1-5分),- 表示没有评分,现在目的是把没有评分的 给预测出来,然后按预测的分数高低,给用户进行推荐。
如何预测缺失的评分呢?对于缺失的评分,可以转化为基于机器学习的回归问题,也就是连续值的预测,对于矩阵分解有如下式子,R是类似图1的评分矩阵,假设N*M维(N表示行数,M表示列数),可以分解为P跟Q矩阵,其中P矩阵维度N*K,P矩阵维度K*M。
式子1
对于P,Q矩阵的解释,直观上,P矩阵是N个用户对K个主题的关系,Q矩阵是K个主题跟M个物品的关系,至于K个主题具体是什么,在算法里面K是一个参数,需要调节的,通常10~100之间。
式子2
对于式子2的左边项,表示的是R^ 第i行,第j列的元素值,对于如何衡量,我们分解的好坏呢,式子3,给出了衡量标准,也就是损失函数,平方项损失,最后的目标,就是每一个元素(非缺失值)的e(i,j)的总和 最小
式子3
OK,目前现在评分矩阵有了,损失函数也有了,该优化算法登场了,下面式子4是,基于梯度下降的优化算法,p,q里面的每个元素的更新方式
式子4
然而,机器学习算法都喜欢加一个正则项,这里面对式子3稍作修改,得到如下式子5,beita 是正则参数
式子5
相应的p,q矩阵各个元素的更新也换成了如下方式
式子6
至此,P,Q矩阵元素求出来了之后,计算某个用户i对某个物品j的评分计算就是p(i,1)*q(1,j)+p(i,2)*q(2,j)+....+p(i,k)*q(k,j)。
二,C++代码实现
第一部分已经给出了,基于矩阵分解的推荐算法的整个流程,下面是该算法编程实现(C/C++),代码加一些注释有助于理解
1 /** 

3 评分矩阵R如下 

5 D1 D2 D3 D4 

7 U1 5 3 - 1 

9 U2 4 - - 1 
10 
11 U3 1 1 - 5 
12 
13 U4 1 - - 4 
14 
15 U5 - 1 5 4 
16 
17 ***/ 
18 
19 #include<iostream> 
20 
21 #include<cstdio> 
22 
23 #include<cstdlib> 
24 
25 #include<cmath> 
26 
27 using namespace std; 
28 
29 
30 
31 void matrix_factorization(double *R,double *P,double *Q,int N,int M,int K,int steps=5000,float alpha=0.0002,float beta=0.02) 
32 
33 { 
34 
35 for(int step =0;step<steps;++step) 
36 
37 { 
38 
39 for(int i=0;i<N;++i) 
40 
41 { 
42 
43 for(int j=0;j<M;++j) 
44 
45 { 
46 
47 if(R[i*M+j]>0) 
48 
49 { 
50 
51 //这里面的error 就是公式6里面的e(i,j) 
52 
53 double error = R[i*M+j]; 
54 
55 for(int k=0;k<K;++k) 
56 
57 error -= P[i*K+k]*Q[k*M+j]; 
58 
59 
60 
61 //更新公式6 
62 
63 for(int k=0;k<K;++k) 
64 
65 { 
66 
67 P[i*K+k] += alpha * (2 * error * Q[k*M+j] - beta * P[i*K+k]); 
68 
69 Q[k*M+j] += alpha * (2 * error * P[i*K+k] - beta * Q[k*M+j]); 
70 
71 } 
72 
73 } 
74 
75 } 
76 
77 } 
78 
79 double loss=0; 
80 
81 //计算每一次迭代后的,loss大小,也就是原来R矩阵里面每一个非缺失值跟预测值的平方损失 
82 
83 for(int i=0;i<N;++i) 
84 
85 { 
86 
87 for(int j=0;j<M;++j) 
88 
89 { 
90 
91 if(R[i*M+j]>0) 
92 
93 { 
94 
95 double error = 0; 
96 
97 for(int k=0;k<K;++k) 
98 
99 error += P[i*K+k]*Q[k*M+j]; 
100 
101 loss += pow(R[i*M+j]-error,2); 
102 
103 for(int k=0;k<K;++k) 
104 
105 loss += (beta/2) * (pow(P[i*K+k],2) + pow(Q[k*M+j],2)); 
106 
107 } 
108 
109 } 
110 
111 } 
112 
113 if(loss<0.001) 
114 
115 break; 
116 
117 if (step%1000==0) 
118 
119 cout<<"loss:"<<loss<<endl; 
120 
121 } 
122 
123 } 
124 
125 
126 
127 int main(int argc,char ** argv) 
128 
129 { 
130 
131 int N=5; //用户数 
132 
133 int M=4; //物品数 
134 
135 int K=2; //主题个数 
136 
137 double *R=new double[N*M]; 
138 
139 double *P=new double[N*K]; 
140 
141 double *Q=new double[M*K]; 
142 
143 R[0]=5,R[1]=3,R[2]=0,R[3]=1,R[4]=4,R[5]=0,R[6]=0,R[7]=1,R[8]=1,R[9]=1; 
144 
145 R[10]=0,R[11]=5,R[12]=1,R[13]=0,R[14]=0,R[15]=4,R[16]=0,R[17]=1,R[18]=5,R[19]=4; 
146 
147 
148 
149 cout<< "R矩阵" << endl; 
150 
151 for(int i=0;i<N;++i) 
152 
153 { 
154 
155 for(int j=0;j<M;++j) 
156 
157 cout<< R[i*M+j]<<','; 
158 
159 cout<<endl; 
160 
161 } 
162 
163 
164 
165 //初始化P,Q矩阵,这里简化了,通常也可以对服从正态分布的数据进行随机数生成 
166 
167 srand(1); 
168 
169 for(int i=0;i<N;++i) 
170 
171 for(int j=0;j<K;++j) 
172 
173 P[i*K+j]=rand()%9; 
174 
175 
176 
177 for(int i=0;i<K;++i) 
178 
179 for(int j=0;j<M;++j) 
180 
181 Q[i*M+j]=rand()%9; 
182 
183 cout <<"矩阵分解 开始" << endl; 
184 
185 matrix_factorization(R,P,Q,N,M,K); 
186 
187 cout <<"矩阵分解 结束" << endl; 
188 
189 
190 
191 cout<< "重构出来的R矩阵" << endl; 
192 
193 for(int i=0;i<N;++i) 
194 
195 { 
196 
197 for(int j=0;j<M;++j) 
198 
199 { 
200 
201 double temp=0; 
202 
203 for (int k=0;k<K;++k) 
204 
205 temp+=P[i*K+k]*Q[k*M+j]; 
206 
207 cout<<temp<<','; 
208 
209 } 
210 
211 cout<<endl; 
212 
213 } 
214 
215 free(P),free(Q),free(R); 
216 
217 return 0; 
218 
219 }

执行的结果如下图所示,

三,展望
前两个部分,已经简单的介绍了最基本的基于矩阵分解的推荐算法,基于该算法的一些变种,类似svd++,pmf等,都是针对某一些特定的数据场景进行的一些改进,那有没有统一的框架来整合这些场景呢??前两年在KDDcup大赛,大出风头的Factorization Machine(FM),其中FM的核心理论在于用Factorization来刻画feature跟feature之间的关系,如下面公式

<Vi,Vj>正是刻画了xi,xj的关系,上面式子可以理解为FM=SVM+Factorization Methods,后续准备开一篇博文,来阐释FM模型,跟其作者开源的LibFM工具箱,最后贴一张八卦的图,图中讲的是bickson(graphlab/graphchi的里面推荐工具包的作者),在一次会议上,对steffen(libfm的作者)问的一个问题
四,后续计划
1),介绍FM模型
2),LibFM源码剖析
参考资料
1),bickson.blogspot.com/2012/08/steffen-rendle-libfm.html‎
2),S. Rendle.Factorization machines.In Proceedings of the 10th IEEE International Conference on Data Mining. IEEE Computer Society,  2010.
3), http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/

本文链接: 基于矩阵分解的推荐算法,简单入门,转载请注明。

相关 [矩阵分解 推荐算法 kobeshow] 推荐:

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

- - 博客园_首页

本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞赛上面,前段时间的百度电影推荐最终结果的前10名貌似都是把矩阵分解作为一个单模型,最后各种ensemble,不知道正在进行的阿里推荐比赛( http://102.alibaba.com/competition/addDiscovery/index.htm),会不会惊喜出现.

矩阵分解的Jungle

- SuperLucky - 增强视觉 | 计算机视觉 增强现实

美帝的法国貌似是美法混血的有心人士(此有心人士长期从事航天飞机研究. )收集了市面上的矩阵分解的几乎所有算法和应用,由于源地址在某神秘物质之外,特转载过来,源地址. Matrix Decompositions has a long history and generally centers around a set of known factorizations such as LU, QR, SVD and eigendecompositions.

矩阵分解在推荐系统中的应用(转)

- -

本文将简单介绍下最近学习到的矩阵分解方法. 开始觉得这种方法很神奇很数学,而且在实际使用的时候也非常好用. 但最近读了Yehuda大神的paper之后,觉得这种方法比较猥琐. 其实,矩阵分解的核心是将一个非常稀疏的评分矩阵分解为两个矩阵,一个表示user的特性,一个表示item的特性,将两个矩阵中各取一行和一列向量做内积就可以得到对应评分.

社会化推荐算法

- - CSDN博客云计算推荐文章

本文是论文《一种结合推荐对象间关联关系的社会化推荐算法》(以下简称论文)的笔记(下). 该论文提出的算法是以PMF为框架基础的. 因而若对PMF不太了解的话,可以参考我的 上一篇文章脑补一下,当然,那篇文章只是概述,详细了解PMF还需要阅读初始论文,但读完那篇文章后,对本文的理解应该没有问题. 所谓社会化推荐算法,是将社交网络的特性加入到推荐系统中来.

常用推荐算法

- - 互联网 - ITeye博客

在推荐系统简介中,我们给出了推荐系统的一般框架. 很明显,推荐方法是整个推荐系统中最核心、最关键的部分,很大程度上决定了推荐系统性能的优劣. 目前,主要的推荐方法包括:基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐、基于知识推荐和组合推荐. 基 于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料.

解析移动游戏运营数据分析指标 - kobeshow

- - 博客园_首页

在平常的工作中,经常会有一些马虎的数据分析师,接到业务方提到的需求后,大致扫一遍然后就吭叽吭叽做起来,最后出的分析结果报告交给业务方后没多久就打回来,说不是他想要结果,仔细一讨论发现双方的指标定义不一致,从而导致了一顿白忙活,造成“十动仍拒”的下场. 所以指标定义的清晰性是开始分析工作的前提.

推荐算法Slope One初探

- - 标点符

Slope One 算法是由 Daniel Lemire 教授在 2005 年提出的一个 Item-Based 推荐算法.  Slope One 算法试图同时满足这样的的 5 个目标: . 易于实现和维护:普通工程师可以轻松解释所有的聚合数据,并且算法易于实现和测试. 运行时可更新的:新增一个评分项,应该对预测结果即时产生影响.

[转]Mahout推荐算法基础

- - 小鸥的博客

Mahout推荐算法分为以下几大类. 2.相近的用户定义与数量. 2.用户数较少时计算速度快. 1.基于item的相似度. 1.item较少时就算速度更快. 2.当item的外部概念易于理解和获得是非常有用. 1基于SlopeOne算法(打分差异规则). 当item数目十分少了也很有效. 需要限制diffs的存储数目否则内存增长太快.

美团推荐算法实践

- - 美团技术团队

推荐系统并不是新鲜的事物,在很久之前就存在,但是推荐系统真正进入人们的视野,并且作为一个重要的模块存在于各个互联网公司,还是近几年的事情. 随着互联网的深入发展,越来越多的信息在互联网上传播,产生了严重的信息过载. 如果不采用一定的手段,用户很难从如此多的信息流中找到对自己有价值的信息. 解决信息过载有几种手段:一种是搜索,当用户有了明确的信息需求意图后,将意图转换为几个简短的词或者短语的组合(即query),然后将这些词或短语组合提交到相应的搜索引擎,再由搜索引擎在海量的信息库中检索出与query相关的信息返回给用户;另外一种是推荐,很多时候用户的意图并不是很明确,或者很难用清晰的语义表达,有时甚至连用户自己都不清楚自己的需求,这种情况下搜索就显得捉襟见肘了.

互联网无处不在的“推荐算法”

- Tiger - 所有文章 - UCD大社区

数据显示,三分之一的用户会根据电子商务网站的推荐买东西,这是任何广告都不可能做到的成绩. 媒体上播放的大众化广告对消费者的影响已经越来越低,于是有人做出预见——个性化推荐技术将成为广告的终极形式.     很多年前,看过一部电影叫作《谁知女人心》,好莱坞大牌梅尔·吉布森饰演的男主角是一个典型的大男子主义者.

矩阵分解的推荐算法入门-好好看相关推荐

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

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

  2. 基于矩阵分解的推荐算法

    https://www.toutiao.com/a6656899746516435469/ 2019-02-12 08:10:52 1.算法介绍 在推荐算法中,主要解决的问题是找到用户对物品的偏好得分 ...

  3. 基于python 的电影推荐算法_基于python语言编程的矩阵分解电影推荐算法

    [实例简介]一种基于矩阵分解方法的电影推荐算法 [实例截图] [核心代码] import numpy as np from numba import cuda, float64, jit from s ...

  4. 矩阵点乘和叉乘的区别_矩阵点乘推荐算法预测图书推荐

    推荐系统 GreedyAIAcademy/Machine-Learning​github.com 推荐系统,顾名思义,就是用于根据用户的喜好,进行对象的推荐 当然,我们这里说的对象不是来预测你会喜欢什 ...

  5. 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法

    [推荐系统入门到项目实战](三):矩阵分解和ALS算法

  6. ML之FE:数据处理—特征工程之高维组合特征的处理案例(矩阵分解)——基于LoR算法的广告点击预估问题

    ML之FE:数据处理-特征工程之高维组合特征的处理案例(矩阵分解)--基于LoR算法的广告点击预估问题 目录 特征工程之高维组合特征的处理思路 1.原始数据:语⾔言和类型两种离散特征 2.为了提高拟合 ...

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

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

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

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

  9. 推荐算法矩阵分解实战——keras算法练习

    当今这个信息爆炸的社会,每个人都会面对无数的商品,无数的选择.而推荐算法的目的帮助大家解决选择困难症的问题,在大千世界中推荐专属于你的商品. 推荐系统算法简介 这里简单介绍下推荐系统中最为主要的协同过 ...

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

    LFM也就是前面提到的Funk SVD矩阵分解 LFM原理解析 LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品,如下图: P矩阵是User-LF矩阵,即 ...

最新文章

  1. 微软2022新bug:大量程序员连夜加班,只因日期数据溢出
  2. 利用ashx和ajax实现表格的异步填充
  3. 【阿里云课程】如何基于GAN完成人脸图像超分辨任务
  4. 使用iframe+postMessage跨域操作和通信
  5. MySql数据库中的子查询使用
  6. calendar前推n天_Shell获取ES3天的索引列表进行迁移操作
  7. 使用flask_socketio实现客户端间即时通信
  8. MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)
  9. wordcount.java_mapreduce中wordcount的java实现
  10. POJ 2299Ultra-QuickSort
  11. tpl-spring-mybatis 模板工程
  12. Win7系统不能记忆窗口大小与位置解决方法
  13. 御剑仙侠服务器维护,修仙无双御剑仙侠
  14. FFT蝶形算法的verilog实现专题——从FFT算法的定义开始入手
  15. 2021年10月数学一及第十三届大数赛部分复习
  16. 计算机二级web最全真题题库下载
  17. 智邦科技亮相2019 ODCC峰会,为开放网络提供弹性解决方案
  18. Python爬虫之知乎回答
  19. 如果你想要做好抖音直播间需要注意的其他事项(三)
  20. Java实现一个学生成绩管理系统,要求存储学生信息并进行增删改查操作。

热门文章

  1. Kubernetes详解(三)——Kubernetes集群组件
  2. STP中各算法接口开销(COST)计算方式
  3. Not enough space in file systems for the current software selection. An additional XXXX MiB is neede
  4. 英特尔一口气发布了三款处理器、两款存储、一款以太网适配器
  5. IOC(控制反转)的理解
  6. javascript数据结构与算法--散列
  7. 转载:世上最全的百物妙用窍门-绝对不能错过,不断更新中
  8. 遇到网络问题,要逐段排查
  9. 中国现代远程与继续教育网 统考 大学英语(B)考试大纲
  10. 理解 Delphi 的类(十) - 深入方法[21] - 开放数组参数