推荐系统中协同过滤应该算是大名鼎鼎了,基本上做推荐的线上都会用协同过滤,比较简单而且效果较好,而协同过滤又分为基于用户的和基于物品的,基本上原理就是“与当前用户行为相似的用户喜欢一个物品,那么当前用户也会喜欢这个物品”,或者“物品A和物品B同时都被一个用户群喜欢,那么认为他们相似”。而协同过滤算法主要有两个模型,最邻近点对模型和潜在语义模型,第一个比较常用且为大家熟知,因为就是定义权值计算相似度,主要介绍第二个。
潜在语义模型最典型的就是矩阵分解模型,矩阵分解模型尝试找到一系列潜在向量参数。对每个用户u,找到一个k维向量Wu,对每个资源i,找到一个k维向量Hi。并且假设模型中每个用户u对每个资源i的兴趣为对应的潜在向量Wu和Hi的内积。说白了就是矩阵分解,然后通过奇异值提取特征来填充矩阵,推荐的本质就是根据矩阵中已知量计算未知量的过程。
对于一个矩阵m行n列矩阵M,存在一个分解使得

M=UΣV∗

M = U \Sigma V^* \,
其中U是mxm阶方阵,Σ是m×n阶非负实数对角矩阵;而V*,即V的共轭转置,是n×n阶方阵,称为M的奇异值分解,Σ对角线上的元素Σi,i即为M的奇异值。
一个非负实数σ是M的一个奇异值仅当存在Km的单位向量u和Kn的单位向量v如下:

Mv=σu and M∗u=σv.

Mv = \sigma u \,\text{ and } M^{*}u= \sigma v. \,\!
其中向量u和v分别为σ的左奇异向量和右奇异向量。

如果一个矩阵分解后奇异值存在0,则奇异值分解结果不唯一。

对于任意的奇异值分解

M=UΣV∗

M = U\Sigma V^{*} \,\!

矩阵Σ的对角线上的元素等于M的奇异值. U和V的列分别是奇异值中的左、右奇异向量。因此,上述定理表明:

  • 一个m×n的矩阵至多有p = min(m,n)个不同的奇异值;
  • 总能在Km中找到由M的左奇异向量组成的一组正交基U;
  • 总能在Kn找到由M的右奇异向量组成的一组正交基V。

svd分解方法基本上搜了半天没有找到,有人了解可以详细解释下,或者后面找到了补充一下,但是基本上都有现成的库可以用。
这里说一下矩阵分解在推荐中的运用:

  1. 利用矩阵分解,然后用 UΣV∗ U\Sigma V^{*} \,\!还原矩阵填充矩阵中未知变量,这样就能知道用户对物品的喜爱程度,然后做推荐
  2. 运用矩阵分解提取特征, 然后获取重要特征,从大到小排序取最大的k个,用M.T*Uk*Σk.I提取物品特征,(这里.T表示矩阵转置,.I表示逆矩阵)由于特征只有k个,矩阵变成m行k列,然后可以很快计算物品相似度,推荐用户喜欢物品的相似物品。
  3. 同样提取重要特征,然后用M*Vk*Σk提取用户特征,计算用户相似度,做用户聚类之类。这里可能有些地方不对,有不对的希望指正。

下面上一个例子,通过矩阵分解提取主要特征,然后计算物品相似度给某个用户推荐物品:

#coding=UTF-8
from numpy import *
from numpy import linalg as ladef loadExData():return[[0, 0, 0, 2, 2],[0, 0, 0, 3, 3],[0, 0, 0, 1, 1],[1, 1, 1, 0, 0],[2, 2, 2, 0, 0],[5, 5, 5, 0, 0],[1, 1, 1, 0, 0]]def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]def ecludSim(inA,inB):return 1.0/(1.0 + la.norm(inA - inB))def pearsSim(inA,inB):if len(inA) < 3 : return 1.0return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1]def cosSim(inA,inB):num = float(inA.T*inB)denom = la.norm(inA)*la.norm(inB)return 0.5+0.5*(num/denom)def standEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0; ratSimTotal = 0.0for j in range(n):userRating = dataMat[user,j]if userRating == 0: continueoverLap = nonzero(logical_and(dataMat[:,item].A>0, \dataMat[:,j].A>0))[0]if len(overLap) == 0: similarity = 0else: similarity = simMeas(dataMat[overLap,item], \dataMat[overLap,j])print 'the %d and %d similarity is: %f' % (item, j, similarity)simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotaldef svdEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0; ratSimTotal = 0.0U,Sigma,VT = la.svd(dataMat)Sig4 = mat(eye(4)*Sigma[:4]) #arrange Sig4 into a diagonal matrixxformedItems = dataMat.T * U[:,:4] * Sig4.I  #create transformed itemsSig = mat(eye(n)*Sigma) #arrange Sig4 into a diagonal matrix#print Sig#print U * Sig * VT #back up source mat#print xformedItems #item feature begin compute item similer#print "user feature:"#xformedUsers = dataMat * VT[:,:4] * Sig4#print xformedUsers#print  xformedUsers * xformedItems.T#print dataMatfor j in range(n):userRating = dataMat[user,j]if userRating == 0 or j==item: continuesimilarity = simMeas(xformedItems[item,:].T,\xformedItems[j,:].T)print 'the %d and %d similarity is: %f' % (item, j, similarity)simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: return ratSimTotal/simTotaldef recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):#print 'type', dataMat[:,:4] #the number user line or colprint nonzero(dataMat[user,:].A==0) # to arrayunratedItems=nonzero(dataMat[user,:].A==0)[1]print unratedItems#unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items if len(unratedItems) == 0: return 'you rated everything'itemScores = []for item in unratedItems:estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]def printMat(inMat, thresh=0.8):for i in range(32):for k in range(32):if float(inMat[i,k]) > thresh:print 1,else: print 0,print ''def imgCompress(numSV=3, thresh=0.8):myl = []for line in open('0_5.txt').readlines():newRow = []for i in range(32):newRow.append(int(line[i]))myl.append(newRow)myMat = mat(myl)print "****original matrix******"printMat(myMat, thresh)U,Sigma,VT = la.svd(myMat)SigRecon = mat(zeros((numSV, numSV)))for k in range(numSV):#construct diagonal matrix from vectorSigRecon[k,k] = Sigma[k]reconMat = U[:,:numSV]*SigRecon*VT[:numSV,:]print "****reconstructed matrix using %d singular values******" % numSVprintMat(reconMat, thresh)
if __name__ == '__main__':print "begin"myData=loadExData2()myMat=mat(myData)#myMat = mat(loadExData)recommend(myMat, 2, 3, cosSim, svdEst)

推荐算法基础--矩阵奇异值分解svd相关推荐

  1. 矩阵论基础知识4——强大的矩阵奇异值分解(SVD)及其应用

    强大的矩阵奇异值分解(SVD)及其应用 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如 ...

  2. 奇异值的物理意义是什么?强大的矩阵奇异值分解(SVD)及其应用

    作者:郑宁 链接:https://www.zhihu.com/question/22237507/answer/53804902 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. 主成分分析(PCA)与矩阵奇异值分解(SVD)

    1 矩阵奇异值分解SVD 1.1 矩阵奇异值分解的数学原理 在关于SVD(Singular Value Decomposition)的讲解中将涉及稍微多一点的数学推导. 定义:设 A A A是秩为 r ...

  4. 推荐算法之--矩阵分解(Matrix Factorization)

    文章目录 推荐算法之--矩阵分解(Matrix Factorization) 1. 共现矩阵 2. 矩阵分解(MF) 3. SVD实现矩阵分解(MF) 4. 梯度下降 实现 矩阵分解(MF) 4.1 ...

  5. 《实用机器学习》(孙亮 黄倩.著)笔记——第七章 推荐算法基础

    一.推荐算法基础 两类基本对象:1.用户(user):2.商品(item) 除了用户-商品的交互信息外,其他可以利用的数据包括: (1)商品的信息,包括商品的价格.类型等: (2)用户的信息,如用户的 ...

  6. Python实现矩阵奇异值分解(SVD)

    Python实现矩阵奇异值分解(SVD) 矩阵奇异值分解(Singular Value Decomposition, SVD)是一种重要的矩阵分解方法,可以将一个矩阵分解成三个矩阵的乘积,即 A = ...

  7. 矩阵的奇异值分解matlab,矩阵奇异值分解(SVD)

    看到一个博客园里讲解奇异值分解的博文,说的很清楚,加深了对SVD的理解,分享一下! 强大的矩阵奇异值分解(SVD)及其应用 摘录一些话如下: 奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一 ...

  8. 强大的矩阵奇异值分解(SVD)及其应用(转)-我们老师推荐的

    本文由LeftNotEasy发布于 http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系 wheeleast@gmail. ...

  9. 强大的矩阵奇异值分解(SVD)及其应用

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

最新文章

  1. $.ajax的type属性,$.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
  2. Hyperledger Fabric安装问题备忘(二)
  3. 【经典面试题一】最长公共子序列(经典动态规划题)
  4. Verilog读写文件
  5. CCF OJ 1113-括号匹配[栈]
  6. 执行命令npm install XXX后仍然提示 Cannot find Module XXX
  7. python导入gif_Python之GIF图倒放,沙雕快乐源泉!我已经笑了一天了!
  8. 计算机中丢失xapofx1 5.dll,xapofx1 5 dll丢失怎么办_系统提示xapofx1 5 dll丢失的解决方法...
  9. python-两种办法验证数据的类型
  10. java语法优化小结
  11. 首发:成功解决MediaCodec中decoder超过720出错的问题
  12. 无线路由器建立usb共享打印服务器,无线路由器USB网络共享管理设置方法
  13. SVN同步分支代码到主干
  14. php日历表代码,PHP输出日历表代码实例
  15. timesten java_使用java调用timesten实现Oracle入库
  16. mysql表设计ppt_PPT表格太丑?这3个设计细节,你一定要收藏!
  17. win7家庭版如何升级到专业版和旗舰版
  18. pmon下nandflash相关操作
  19. 带轮轮毂长度l和带轮宽b表_A型V带轮的轮缘宽B,轮毂孔径D和轮毂长L.doc
  20. CAN总线技术在石油工程行业中的应用

热门文章

  1. ECDSA算法实现源码
  2. Windows系统如何设置电脑内网连接网线,外网连接wifi
  3. Excel数据的排序
  4. CSS 基础知识之垂直水平居中
  5. 安卓移动办公软件_office办公软件,支持安卓和ios双端
  6. 2019中国互联网大会都说了什么?鹰眼大数据帮您解析!
  7. 提高学习能力相关问题100问
  8. 爬取超星考试题目_如何利用搜题软件查找《超星慕课》考试题目答案?
  9. ATEMTelevisionStudio系列切换台
  10. Winscp连接openwrt路由器失败问题解决