加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

NMF算法简介及python实现

(2012-10-22 13:31:47)
标签:

it

分类: computervision

NMF算法简介及python实现

分类: 数据挖掘 2012-02-25 19:51 356人阅读 评论(0) 收藏 举报

原文链接:http://www.albertauyeung.com/mf.php

基本原理

NMF,非负矩阵分解,它的目标很明确,就是将大矩阵分解成两个小矩阵,使得这两个小矩阵相乘后能够还原到大矩阵。而非负表示分解的矩阵都不包含负 值。 从应用的角度来说,矩阵分解能够用于发现两种实体间的潜在特征,一个最常见的应用就是协同过滤中的预测打分值,而从协同过滤的这个角度来说,非负也很容易 理解:打分都是正的,不会出现负值。

在例如Netflix或MovieLens这样的推荐系统中,有用户和电影两个集合。给出每个用户对部分电影的打分,我们希望预测该用户对其他没看 过电影的打分值,这样可以根据打分值为其做出推荐。用户和电影的关系,可以用一个矩阵来表示,每一行表示用户,每一列表示电影,每个元素的值表示用户对已 经看过的电影的打分,矩阵看起来如下:

  D1 D2 D3 D4
U1 5 3 - 1
U2 4 - - 1
U3 1 1 - 5
U4 1 - - 4
U5 - 1 5 4

而使用矩阵分解来预测评分的思想来源于,我们可以通过矩阵分解来发现一些用户打分的潜在特征。比如两个人都喜欢某一演员,那他们就倾向于给TA演的电影打高分;或者两个人都喜欢动作片。假如我们能够发现这些特征,我们就能够预测特定用户对特定电影的打分。

为了发现不同的特征,我们假设特征的数量少于用户和电影的数量(要是每个用户都有一个独立特征,那代价也太大啦)。

数学基础

首先,我们定义U为用户的集合,D为电影的集合,R = U * D,为评分的集合。假设我们需要寻找K个特征,则我们的目标是,找到两个矩阵P和Q,使得它们相乘近似等于R。即:

http://www.albertauyeung.com/latex-images/mf-o010.png

这样P的每一行表示用户,每一列表示一个特征,它们的值表示用户与某一特征的相关性,值越大,表明特征越明显。同理,Q的每一行表示电影,每一列表示电影与特征的关联。最后为了预测用户ui对特定电影dj的评分,我们可以直接计算ui和dj对应的特征向量的点积,即:

http://www.albertauyeung.com/latex-images/mf-o017.png

现在我们就来计算P和Q。最简单的方法就是梯度下降,该方法先初始化P和Q为特定的值,计算它们的乘积与真实矩阵的误差,然后通过迭代,逐渐减小误差直至收敛。

由于误差可大可小,这里使用平方根误差(squared error)来计算,计算公式如下:

http://www.albertauyeung.com/latex-images/mf-o021.png

即循环地计算每一条目的误差,最后相加。

为了最小化误差,我们需要知道怎么改变Pij和Qkj的值(在梯度下降中表现为下降的方向)。我们对这个公式求偏微分,即得:

http://www.albertauyeung.com/latex-images/mf-o024.png

http://www.albertauyeung.com/latex-images/mf-o025.png

计算出梯度之后,我们逐步更新Pik和Qkj:

http://www.albertauyeung.com/latex-images/mf-o028.png

http://www.albertauyeung.com/latex-images/mf-o029.png

上面公式中,http://www.albertauyeung.com/latex-images/mf-o030.png为梯度下降常数,通常取一个较小的值(防止无法收敛),如0.0002。

有人可能会问一个问题:假如我们计算出P和Q,使得P*Q近似等于R,那么那些未评分的不全是0了么?首先,我们并不要求P*Q精确等于R;其次, 我们输入的数据是所有已评分的数据(或它的子集),即训练集,而并不包含未评分的数据。因此,它能够对未评分的做出不等于0的预测。

通过上面的更新规则,我们就可以逐步减小误差,直至收敛:

http://www.albertauyeung.com/latex-images/mf-o045.png


规范化

上面的算法只是最简单的一个实现,实际使用中可能复杂得多。一个最常见的修改就是引入规范化,以防止过度拟合。这通过加入另外一个参数http://www.albertauyeung.com/latex-images/mf-o046.png来修改误差公式:

http://www.albertauyeung.com/latex-images/mf-o047.png

参数http://www.albertauyeung.com/latex-images/mf-o046.png用来控制用户特征向量与条目特征向量的比例,以避免出现特征向量中出现特别大的值。实际应用中,通常设置为0~0.02之间的值。因此更新公式变成:

http://www.albertauyeung.com/latex-images/mf-o053.png

http://www.albertauyeung.com/latex-images/mf-o054.png


一个简单的python实现如下(需要安装numpy)

  1. import numpy  
  2.    
  3. def matrix_factorisation(R, P, Q, K, steps=5000alpha=0.0002beta=0.02):  
  4.     Q.T  
  5.     for step in xrange(steps):  
  6.         for in xrange(len(R)):  
  7.             for in xrange(len(R[i])):  
  8.                 if R[i][j] 0 
  9.                     eij R[i][j] numpy.dot(P[i,:],Q[:,j])  
  10.                     for in xrange(K):  
  11.                         P[i][k] P[i][k] alpha (2 eij Q[k][j] beta P[i][k])  
  12.                         Q[k][j] Q[k][j] alpha (2 eij P[i][k] beta Q[k][j])  
  13.         eR numpy.dot(P,Q)  
  14.         0  
  15.         for in xrange(len(R)):  
  16.             for in xrange(len(R[i])):  
  17.                 if R[i][j] 0 
  18.                     pow(R[i][j] numpy.dot(P[i,:],Q[:,j]), 2 
  19.                     for in xrange(K):  
  20.                         (beta/2(pow(P[i][k],2pow(Q[k][j],2))  
  21.         if 0.001 
  22.             break  
  23.     return P, Q.T  
使用示例如下:
  1.  
  2.      [5,3,0,1],  
  3.      [4,0,0,1],  
  4.      [1,1,0,5],  
  5.      [1,0,0,4],  
  6.      [0,1,5,4],  
  7.      
  8.    
  9. numpy.array(R)  
  10.    
  11. len(R)  
  12. len(R[0])  
  13. 2  
  14.    
  15. numpy.random.rand(N,K)  
  16. numpy.random.rand(M,K)  
  17.    
  18. nP, nQ matrix_factorisation(R, P, Q, K)  
  19. nR numpy.dot(nP, nQ.T)  

最后P*Q还原出的矩阵如下:
  D1 D2 D3 D4
U1 4.97 2.98 2.18 0.98
U2 3.97 2.40 1.97 0.99
U3 1.02 0.93 5.32 4.93
U4 1.00 0.85 4.59 3.93
U5 1.36 1.07 4.89 4.12
可以看到,还原后的矩阵跟原矩阵很接近,并且对原来空缺的值作出了预测。在这个例子中,我们可以看到U1和U2口味比较接近,他们都喜欢D1和D2。而其他的用户则喜欢D3,D4和D5。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有