用于推荐系统的SVD算法python实现

转载:https://blog.csdn.net/taozhaojie/article/details/52790032

SVD算法python实现


之前看到一篇实现SVD算法的blog,但是实现方法没有用到矩阵。为了更直观简便高效的实现SVD算法,在这里基于numpy重新写了一遍。


原blog转载较多,已经找不到原作者了,参考以下地址:

http://blog.csdn.net/recsysml/article/details/12287513


这里用到的算法是优化下面这个目标函数:



代码如下:

参数: mat - 输入矩阵, feature - latent factor数量

[python]  view plain  copy
  1. def svd(mat, feature, steps=500, gama=0.02, lamda=0.3):  
  2.     slowRate = 0.99  
  3.     preRmse = 1000000000.0  
  4.     nowRmse = 0.0  
  5.   
  6.     user_feature = numpy.matrix(numpy.random.rand(mat.shape[0], feature))  
  7.     item_feature = numpy.matrix(numpy.random.rand(mat.shape[1], feature))  
  8.   
  9.     for step in range(steps):  
  10.         rmse = 0.0    
  11.         n = 0    
  12.         for u in range(mat.shape[0]):  
  13.             for i in range(mat.shape[1]):  
  14.                 if not numpy.isnan(mat[u,i]):  
  15.                     pui = float(numpy.dot(user_feature[u,:], item_feature[i,:].T))  
  16.                     eui = mat[u,i] - pui  
  17.                     rmse += pow(eui, 2)  
  18.                     n += 1   
  19.                     for k in range(feature):  
  20.                         user_feature[u,k] += gama*(eui*item_feature[i,k] - lamda*user_feature[u,k])  
  21.                         item_feature[i,k] += gama*(eui*user_feature[u,k] - lamda*item_feature[i,k]) # 原blog这里有错误   
  22.   
  23.         nowRmse = sqrt(rmse * 1.0 / n)  
  24.         print 'step: %d      Rmse: %s' % ((step+1), nowRmse)  
  25.         if (nowRmse < preRmse):    
  26.             preRmse = nowRmse  
  27.         else:  
  28.             break # 这个退出条件其实还有点问题  
  29.         gama *= slowRate  
  30.         step += 1  
  31.   
  32.     return user_feature, item_feature  


为什么不能用Scipy和Scikit里面的SVD实现


python在scipy和scikit里面都有不同的svd实现方法,但是这些方法有一个共同的问题,就是没有考虑缺失值(missing value)的问题,即输入的原始矩阵不能有nan值。这时就需要去填入这些缺失值,不论是填0还是填均值,都会影响结果的准确性。


猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/80547427