本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统。

1.SVD详解

SVD(singular value decomposition),翻译成中文就是奇异值分解。SVD的用处有很多,比如:LSA(隐性语义分析)、推荐系统、特征压缩(或称数据降维)。SVD可以理解为:将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性。

1.1奇异值分解的几何意义(因公式输入比较麻烦所以采取截图的方式)

2.SVD应用于推荐系统

数据集中行代表用户user,列代表物品item,其中的值代表用户对物品的打分。基于SVD的优势在于:用户的评分数据是稀疏矩阵,可以用SVD将原始数据映射到低维空间中,然后计算物品item之间的相似度,可以节省计算资源。

整体思路:先找到用户没有评分的物品,然后再经过SVD“压缩”后的低维空间中,计算未评分物品与其他物品的相似性,得到一个预测打分,再对这些物品的评分从高到低进行排序,返回前N个物品推荐给用户。

具体代码如下,主要分为5部分:

第1部分:加载测试数据集;

第2部分:定义三种计算相似度的方法;

第3部分:通过计算奇异值平方和的百分比来确定将数据降到多少维才合适,返回需要降到的维度;

第4部分:在已经降维的数据中,基于SVD对用户未打分的物品进行评分预测,返回未打分物品的预测评分值;

第5部分:产生前N个评分值高的物品,返回物品编号以及预测评分值。

优势在于:用户的评分数据是稀疏矩阵,可以用SVD将数据映射到低维空间,然后计算低维空间中的item之间的相似度,对用户未评分的item进行评分预测,最后将预测评分高的item推荐给用户。

  1. #coding=utf-8
  2. from numpy import *
  3. from numpy import linalg as la
  4.  
  5. '''加载测试数据集'''
  6. def loadExData():
  7. return mat([[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
  8. [0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
  9. [0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
  10. [3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
  11. [5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
  12. [0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
  13. [4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
  14. [0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
  15. [0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
  16. [0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
  17. [1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]])
  18.  
  19. '''以下是三种计算相似度的算法,分别是欧式距离、皮尔逊相关系数和余弦相似度,
  20. 注意三种计算方式的参数inA和inB都是列向量'''
  21. def ecludSim(inA,inB):
  22. return 1.0/(1.0+la.norm(inA-inB)) #范数的计算方法linalg.norm(),这里的1/(1+距离)表示将相似度的范围放在0与1之间
  23.  
  24. def pearsSim(inA,inB):
  25. if len(inA)<3: return 1.0
  26. return 0.5+0.5*corrcoef(inA,inB,rowvar=0)[0][1] #皮尔逊相关系数的计算方法corrcoef(),参数rowvar=0表示对列求相似度,这里的0.5+0.5*corrcoef()是为了将范围归一化放到0和1之间
  27.  
  28. def cosSim(inA,inB):
  29. num=float(inA.T*inB)
  30. denom=la.norm(inA)*la.norm(inB)
  31. return 0.5+0.5*(num/denom) #将相似度归一到0与1之间
  32.  
  33. '''按照前k个奇异值的平方和占总奇异值的平方和的百分比percentage来确定k的值,
  34. 后续计算SVD时需要将原始矩阵转换到k维空间'''
  35. def sigmaPct(sigma,percentage):
  36. sigma2=sigma**2 #对sigma求平方
  37. sumsgm2=sum(sigma2) #求所有奇异值sigma的平方和
  38. sumsgm3=0 #sumsgm3是前k个奇异值的平方和
  39. k=0
  40. for i in sigma:
  41. sumsgm3+=i**2
  42. k+=1
  43. if sumsgm3>=sumsgm2*percentage:
  44. return k
  45.  
  46. '''函数svdEst()的参数包含:数据矩阵、用户编号、物品编号和奇异值占比的阈值,
  47. 数据矩阵的行对应用户,列对应物品,函数的作用是基于item的相似性对用户未评过分的物品进行预测评分'''
  48. def svdEst(dataMat,user,simMeas,item,percentage):
  49. n=shape(dataMat)[1]
  50. simTotal=0.0;ratSimTotal=0.0
  51. u,sigma,vt=la.svd(dataMat)
  52. k=sigmaPct(sigma,percentage) #确定了k的值
  53. sigmaK=mat(eye(k)*sigma[:k]) #构建对角矩阵
  54. xformedItems=dataMat.T*u[:,:k]*sigmaK.I #根据k的值将原始数据转换到k维空间(低维),xformedItems表示物品(item)在k维空间转换后的值
  55. for j in range(n):
  56. userRating=dataMat[user,j]
  57. if userRating==0 or j==item:continue
  58. similarity=simMeas(xformedItems[item,:].T,xformedItems[j,:].T) #计算物品item与物品j之间的相似度
  59. simTotal+=similarity #对所有相似度求和
  60. ratSimTotal+=similarity*userRating #用"物品item和物品j的相似度"乘以"用户对物品j的评分",并求和
  61. if simTotal==0:return 0
  62. else:return ratSimTotal/simTotal #得到对物品item的预测评分
  63.  
  64. '''函数recommend()产生预测评分最高的N个推荐结果,默认返回5个;
  65. 参数包括:数据矩阵、用户编号、相似度衡量的方法、预测评分的方法、以及奇异值占比的阈值;
  66. 数据矩阵的行对应用户,列对应物品,函数的作用是基于item的相似性对用户未评过分的物品进行预测评分;
  67. 相似度衡量的方法默认用余弦相似度'''
  68. def recommend(dataMat,user,N=5,simMeas=cosSim,estMethod=svdEst,percentage=0.9):
  69. unratedItems=nonzero(dataMat[user,:].A==0)[1] #建立一个用户未评分item的列表
  70. if len(unratedItems)==0:return 'you rated everything' #如果都已经评过分,则退出
  71. itemScores=[]
  72. for item in unratedItems: #对于每个未评分的item,都计算其预测评分
  73. estimatedScore=estMethod(dataMat,user,simMeas,item,percentage)
  74. itemScores.append((item,estimatedScore))
  75. itemScores=sorted(itemScores,key=lambda x:x[1],reverse=True)#按照item的得分进行从大到小排序
  76. return itemScores[:N] #返回前N大评分值的item名,及其预测评分值
  1. 将文件命名为svd2.py,在python提示符下输入:
  1. >>>import svd2
  2. >>>testdata=svd2.loadExData()
  3. >>>svd2.recommend(testdata,1,N=3,percentage=0.8)#对编号为1的用户推荐评分较高的3件商品

Reference:

1.Peter Harrington,《机器学习实战》,人民邮电出版社,2013

2.http://www.ams.org/samplings/feature-column/fcarc-svd (讲解SVD非常好的一篇文章,对于理解SVD非常有帮助,本文中SVD的几何意义就是参考这篇)

3. http://blog.csdn.net/xiahouzuoxin/article/details/41118351 (讲解SVD与特征值分解区别的一篇文章)

[机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用的更多相关文章

  1. SVD在餐馆菜肴推荐系统中的应用

    SVD在餐馆菜肴推荐系统中的应用 摘要:餐馆可以分为很多类别,比如中式.美式.日式等等.但是这些类别不一定够用,有的人喜欢混合类别.对用户对菜肴的点评数据进行分析,可以提取出区分菜品的真正因素,利用这 ...

  2. 【疑难杂症】奇异值分解(SVD)原理与在降维中的应用

    前言 在项目实战的特征工程中遇到了采用SVD进行降维,具体SVD是什么,怎么用,原理是什么都没有细说,因此特开一篇,记录下SVD的学习笔记 参考:刘建平老师博客 https://www.cnblogs ...

  3. 机器学习之-奇异值分解(SVD)原理详解及推导

    转载 http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充 ...

  4. [机器学习笔记]主成分分析PCA简介及其python实现

    主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量. PCA的本质就是找一些投影 ...

  5. 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  6. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  7. Python机器学习笔记:奇异值分解(SVD)算法

    完整代码及其数据,请移步小编的GitHub 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/MachineLearningNote 奇异值分解(Singu ...

  8. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  9. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  2. 编写高质量代码:改善Java程序的151个建议 --[0~25]

    警惕自增的陷阱 public class Client7 { public static void main(String[] args) { int count=0; for(int i=0; i& ...

  3. nio 阻塞 非阻塞 同步 异步

    https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...

  4. css 圆形头像

    方法一:背景图片(推荐) 好处是,图片长宽不等的情况下图片不会变形 .ui-photo { width: 100px; height: 100px; background: url("img ...

  5. ArcGIS for qml -设置地图和视域中心

    源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 ArcGIS R ...

  6. [THUWC2017]在美妙的数学王国中畅游

    [THUWC2017]在美妙的数学王国中畅游 e和sin信息不能直接合并 泰勒展开,大于21次太小,认为是0,保留前21次多项式即可 然后就把e,sin ,kx+b都变成多项式了,pushup合并 上 ...

  7. 小Y的炮

    [存代码] #include<bits/stdc++.h> #define N 1000001 #define MAXN 100001 using namespace std; int n ...

  8. MVC控制器传递多个实体类集合到视图的方案总结

    MVC控制器向视图传递数据包含多个实体类的解决方案有很多,这里主要针对视图模型.动态模型以及Tuple三种方法进行一些总结与记录. 基础集合类:TableA namespace ViewModelSt ...

  9. (分治法 快速幂)P1226 【模板】快速幂||取余运算 洛谷

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 输入输 ...

  10. mysql数据库连接useSSL=true

    web应用中连接mysql数据库时控制台会出现这样的提示: Establishing SSL connection without server's identity verification is ...