推荐系统——隐因子的矩阵分解法

  在新手接触推荐系统这个领域时,遇到第一个理解起来比较困难的就是协同过滤法。那么如果这时候百度的话,得到最多的是奇异值分解法,即(SVD)。SVD的作用大致是将一个矩阵分解为三个矩阵相乘的形式。如果运用在推荐系统中,首先我们将我们的训练集表示成矩阵的形式,这里我们以movielen数据集为例。这个数据集包含了用户对电影的评分。那么矩阵形式大致为:

  movie1  movie2  movie3 moive4
user1 1      
user2 2     3
user3   5 4  
user4 2     4

  其中1~5就是对应用户对电影的评分。空余处表示数据集中没有对应用户和电影的信息。如果我们想使用SVD,一般讲空余处都填为0.假设此矩阵为V.那么运用SVD可以得到

                          V = UΣVT

  但是上面的等号并不能取到,只能是约等于。那么我们将得到的三个矩阵相乘得到V‘(注意与V不同)。那么原来的空白处(也就是0处)可能就不再为0,那么这就是对该user-moive对的预测。这就是SVD的主要原理。因为SVD有很多现成的算法,也不用迭代就可直接得到,所以使用比较方便。

  但是我们会看到,上面方法有一个致命的缺陷,那就是将未知的评分全都设为0.这其实是极其不合理的,因为用户不给某个电影打分并不是很不喜欢(0分),而是有可能还没有看过这个电影。这样就加入了我们主观臆断的信息,最后造成错误。解决的方法就是使用隐因子的矩阵分解法。注意矩阵分解法和SVD有相似的地方也有不同的地方,下面我就对矩阵分解法进行详细介绍。

  在矩阵分解法中,有一个假设,就是每一个用户都有一个长度为k的特征向量,每一部电影也有一个相同长度的特征向量(k一般需要用户指定)。那么所有用户的特征向量排列成一个矩阵 U 的维度为UserNum * k。其中用户i对应的向量为Ui。所有电影的特征向量排列成一个矩阵M 的维度为MoiveNum * k。其中电影j对应的向量为Uj。那么用户i对电影j的评分 Vij = <Ui , Mj>(<>代表点乘)。那么所有用户和所有电影之间的评分就可以用两个矩阵相乘来得到:

                          V‘ = UMT

  注意这里是V‘而不是V。那么问题来了,我们如何确定这个U和M?一个自然的想法就是让V‘和V尽可能地相等。那么这又有一个问题,那就是V(即数据集)有很多地方是没有评分的,如何判断和V‘是否相等?那么我们在这里只计算有评分处的MSE。这样既没有使用额外的信息,又能判断两者是否接近。那么自然而然得就引入了我们的lost function:

      

  这里Iij表示用户i对电影j有评分记录。后面两项是惩罚因子,目的是防止过拟合。那么利用梯度下降法,我们就可以通过迭代得到U和M的值。其对U和对M的求到如下:

  到这里我们就已经完成了基础的矩阵分解法。那么进一步,为了实现更好的效果,我们要考虑每个个体打分的影响,因为有些用户打分偏高,有些用户打分偏低。同样对于电影和所有的评分。所以我们评分的计算公式应该改为:

      Vij = <Ui,Mj> + overall_mean + ai +bj

  其中overall_mean是所有评分的平均值,ai是用户i打分的平均值,bj是电影j得分的平均值。其中overall_mean认为是一个常数,而ai和bj都是需要优化的参数。这里我们就不给出对他们求导的式子,我直接给出矩阵形式的算法,便于大家具体实现。(INCOMING)

  我自己写了一个python版的,有兴趣可以参考 https://github.com/ccienfall/RecommandSystem/blob/master/script/Factorize.py

  参考文献:《A Guide to Singular Value Decomp osition for Collaborative Filtering》

时间: 2024-10-08 10:34:32

推荐系统——隐因子的矩阵分解法的相关文章

Guass列选主元消去法和三角分解法

最近数值计算学了Guass列主消元法和三角分解法解线性方程组,具体原理如下: 1.Guass列选主元消去法对于AX =B 1).消元过程:将(A|B)进行变换为,其中是上三角矩阵.即: k从1到n-1 a. 列选主元 选取第k列中绝对值最大元素作为主元. b. 换行 c. 归一化 d. 消元 2).回代过程:由解出. 2.三角分解法(Doolittle分解) 将A分解为如下形式 由矩阵乘法原理 a.计算U的第一行,再计算L的第一列 b.设已求出U的1至r-1行,L的1至r-1列.先计算U的第r行

Miiler-Robin素数测试与Pollard-Rho大数分解法

板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素数测试基于以下两个原理: 费马小定理 即我们耳熟能详的 对于质数\(p\) \[a^{p - 1} \equiv 1 \pmod p\] 二次探测原理 对于质数\(p\),如果存在\(x\)满足 \[x^2 \equiv 1 \pmod p\] 那么\(x\)只能是\(1\)或者\(p - 1\)

线性方程组的分解法——LU分解法

1.代码 %%LU分解法 function LUDM = LU_Decomposition_method(A,b) global n;global B;global U;global L;global M; [n,n] = size(A); B = [A,b]; R_A = rank(A);R_B = rank(B); if R_A ~= R_B disp('方程无解'); elseif (R_A == R_B) && (R_A == n) disp('此方程有唯一解'); M = LU_

经验模态分解法简析 (转)

http://blog.sina.com.cn/s/blog_55954cfb0102e9y2.html 美国工程院士黄锷博士于1998年提出的一种信号分析方法:重点是黄博士的具有创新性的经验模态分解(Empirical Mode Decomposition)即EMD法,它是一种自适应的数据处理或挖掘方法,非常适合非线性,非平稳时间序列的处理,本质上是对数据序列或信号的平稳化处理. 1:关于时间序列平稳性的一般理解: 所谓时间序列的平稳性,一般指宽平稳,即时间序列的均值和方差为与时间无关的常数,

系统架构正交分解法

[Architecture] 系统架构正交分解法 [Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大蓝图去做分析设计.先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里使用正交分解法,来分析设计新浪微博平台的系统架构. 透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与

[Architecture] 系统架构正交分解法

[Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大蓝图去做分析设计.先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里,使用正交分解法,来分析设计新浪微博平台的系统架构. 透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与组织整个系统架构所使用到的框架技术.本篇文章介绍

L1-006 连续因子 (20 分) 模拟

一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 3×5×6×7,其中 5.6.7 就是 3 个连续的数字.给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入格式: 输入在一行中给出一个正整数 N(1). 输出格式: 首先在第 1 行输出最长连续因子的个数:然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内. 输入样例: 630 输出样例: 3 5*6*7 #incl

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李志刚 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙

BestCoder#19 HDU5108(质因数分解法)

Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1614    Accepted Submission(s): 193 Problem Description Alexandra has a little brother. He is new to programming. One