1 SVD 相关理论

1.1 奇异值分解定义

SVD,即奇异值分解,矩阵论中学过内容,公式为:

用一张图来形象表达一下:

其中的奇异值矩阵,奇异值从大到小排列,而且减少的特别快,我们可以用前面最大的k个奇异值来表示这个原有矩阵,且保留大部分信息。如图:

1.2 与PCA有何勾结

之前我们解释过 PCA ,PCA 的本质就是将原数据投影到低维坐标系中,获取主要信息值,起到降维作用。

究竟 SVD 与其有何关系呢?我们看一下下面的公式推导,就明白了。

由上图可以比较出,PCA 中得到的 P 就是奇异值分解中的 V。

如果需要给列降维到 k ,则:

如果需要给行降维到 k ,则:

左奇异矩阵负责给行降维,一般用来减小无效样本。

   右奇异矩阵负责给列降维,一般用来缩减特征。

1.3 优点与用途

优点:

当我们使用PCA的时候,用到协方差矩阵,但是当样本数量m大特征n也大的时候,协方差就不好计算,特征值和特征向量就不易求出。此时如果使用SVD,速度快很多,有人会说,奇异值分解时不也是利用了协方差矩阵么?其实不然这只是求取分解的一种方法,一般会使用迭代的办法,这里不赘述,只需明白它的计算速度远远加快,有兴趣可以看看这两篇文章:

并行计算奇异值:https://www.cnblogs.com/zhangchaoyang/articles/2575948.html

一篇关于奇异值计算的论文:http://www.cs.utexas.edu/users/inderjit/public_papers/HLA_SVD.pdf

  用途:

  1. 特征降维

  2. 去除噪声

  3. 推荐系统

  4. 信息搜索(潜在语义分析,LSA)

2 Python 实例

2.1 基于 SVD 的图像压缩

 1 from numpy import *
 2 from numpy import linalg as la
 3
 4 def printMat(inMat,thresh=0.8):
 5     for i in range(32):
 6         for k in range(32):
 7             if float(inMat[i,k])>thresh:
 8                 # pycharm中会自动换行,此处加上 end=‘’ ,以达到效果
 9                 print('1',end='')
10             else:
11                 print('0',end='')
12         print('')
13
14 def imgCompress(numSV=3,thresh=0.8):
15     my1=[]
16     for line in open('0_5.txt').readlines():
17         newRow=[]
18         for i in range(32):
19             newRow.append(int(line[i]))
20         my1.append(newRow)
21     myMat=mat(my1)
22     print(myMat)
23     print("***** original matrix *****")
24     printMat(myMat,thresh)
25     U,Sigma,VT=la.svd(myMat)
26     SigRecon=mat(zeros((numSV,numSV)))
27     for k in range(numSV):
28         SigRecon[k,k]=Sigma[k]
29     reconMat=U[:,:numSV]*SigRecon*VT[:numSV,:]
30     print("***** reconstructed matrix using %d singular values *****")
31     printMat(reconMat,thresh)
32
33 imgCompress(2)

分析:

  1. 左边原始矩阵,右边是奇异值分解后处理矩阵,得到的图像基本一致,可以看到只需要两个奇异值就能相对准确地对图像重建。
  2. 内存使用:原始图像:32*32=1024,奇异值分解后:2*32+2+2*32=130,缩小了将近10倍。

2.2 餐馆菜肴推荐引擎

过程:

  1. 寻找用户没有评级的菜肴,即在用户-物品矩阵中的 0 值。
  2. 在用户没有评级的所有物品中,对每个物品预计一个可能的评级的分数。(利用相似度进行计算)
  3. 对这些物品的评分从高到低排序,返回前 N 个物品。

程序:

  1 from numpy import *
  2 from numpy import linalg as la
  3 import matplotlib.pyplot as plt
  4
  5 # 1. 输入数据,用户-物品评级矩阵
  6 def loadExData2():
  7     return [[2, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0],
  8             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
  9             [0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0],
 10             [3, 3, 4, 0, 3, 0, 0, 2, 2, 0, 0],
 11             [5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0],
 12             [0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0],
 13             [4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5],
 14             [0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4],
 15             [0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0],
 16             [0, 0, 0, 3, 0, 0, 0, 0, 4, 5, 0],
 17             [1, 1, 2, 1, 1, 2, 1, 0, 4, 5, 0]]
 18
 19 # 2. 几种计算相似度的方法,
 20 # 欧式距离
 21 def ecludSim(inA,inB):
 22     return 1.0/(1.0+la.norm(inA-inB))
 23 # 皮尔逊距离
 24 def pearsSim(inA,inB):
 25     if len(inA)<3:
 26         return 1.0
 27     return 0.5+0.5*corrcoef(inA,inB,rowvar=0)[0][1]
 28 # 余弦距离
 29 def cosSim(inA,inB):
 30     num =float(inA.T*inB)
 31     denom=la.norm(inA)*la.norm(inB)
 32     return 0.5+0.5*(num/denom)
 33
 34 # 3. 计算给定相似度计算方法下的估计评分值
 35 # 指定用户 user 给未评定物品 item 评分
 36 def standEst(dataMat,user,simMeas,item):
 37     n=shape(dataMat)[1]
 38     simTotal=0.0
 39     ratSimTotal=0.0
 40     # 遍历每一个物品,根每一个有过评分的物品比较,计算相似度,推测出评分
 41     for j in range(n):
 42         userRating=dataMat[user,j]
 43         # 如果某个用户没有对这个物品评分,跳过这个值
 44         if userRating==0:
 45             continue
 46         # 比较目标物品和已被评分过的物品重合程度
 47         overLap=nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
 48         # 如果重合为0,则相似度为0
 49         if len(overLap)==0:
 50             similarity=0
 51         else:
 52             # 如果有重合,基于这些特征重合计算相似度
 53             similarity=simMeas(dataMat[overLap,item],dataMat[overLap,j])
 54             # print("the %d and %d similarity is: %f "%(item,j,similarity))
 55         # 累加相似度
 56         simTotal+=similarity
 57         # 累加相似度和评分的乘积,可以得到评分总和,(归一化的)
 58         ratSimTotal+=similarity*userRating
 59     if simTotal==0:
 60         return 0
 61     else:
 62         return ratSimTotal/simTotal
 63
 64 # 4. 使用 SVD 降维后进行相似度计算
 65 def svdEst(dataMat,user,simMeas,item):
 66     n=shape(dataMat)[1]
 67     simTotal=0.0
 68     ratSimTotal=0.0
 69     U, Sigma, VT = la.svd(dataMat)
 70     # 取 sigma 前4的值,构建对角矩阵
 71     Sig4=mat(eye(4)*Sigma[:4])
 72     # 将原数据投影到左奇异矩阵上,使其行降维,即减少无效用户
 73     xformedItems=dataMat.T*U[:,:4]*Sig4.I
 74     for j in range(n):
 75         userRating=dataMat[user,j]
 76         if userRating==0 or j==item:
 77             continue
 78         similarity=simMeas(xformedItems[item,:].T,xformedItems[j,:].T)
 79         # print("the %d and %d similarity is: %f "%(item,j,similarity))
 80         simTotal += similarity
 81         # 累加相似度和评分的乘积,可以得到评分总和,(归一化的)
 82         ratSimTotal += similarity * userRating
 83     if simTotal == 0:
 84         return 0
 85     else:
 86         return ratSimTotal / simTotal
 87
 88 # 5. 推荐引擎,返回得分较高的前 N 个物品
 89 def recommend(dataMat,user,N=3,simMeas=cosSim,estMethod=standEst):
 90     # 寻找未评级的物品
 91     unratedItems=nonzero(dataMat[user,:].A==0)[1]
 92     if len(unratedItems)==0:
 93         return print("you rated everything")
 94     itemScores=[]
 95     for item in unratedItems:
 96         estimatedScore=estMethod(dataMat,user,simMeas,item)
 97         itemScores.append((item,estimatedScore))
 98     return sorted(itemScores,key=lambda jj:jj[1],reverse=True)[:N]
 99
100 myMat=mat(loadExData2())
101 print(recommend(myMat,1,estMethod=svdEst))
102 print(recommend(myMat,1))
103 U,Sigma,VT=linalg.svd(myMat)
104 Sig2=Sigma**2
105 fig=plt.figure()
106 ax=fig.add_subplot(111)
107 ax.pie(Sig2,autopct='%1.1f')
108 plt.show()

View Code

结果:

分析:

  1. 对奇异值分析可知,前五个值占了绝大部分信息(注意这里与书里有些不一致)
  2. 使用SVD分解后的数据推荐引擎更准确

提高构建推荐引擎时的效率:

  1. SVD 大量数据分解速度慢,尽量运行一次或者离线运行。
  2. 零元素太多,通过储存非零元素节省资源。
  3. 每次需要推荐一个得分时,都需要计算多个物品的相似度,离线计算并保存相似度。
  4. 冷启动问题:如何在缺乏数据时给出好的推荐。将推荐看成搜索问题。

参考文献:

  1. 奇异值分解与在降维中的应用    https://www.cnblogs.com/pinard/p/6251584.html

转载于:https://www.cnblogs.com/Ray-0808/p/11000591.html

机器学习实战 11- SVD相关推荐

  1. knn的python代码_《机器学习实战》之一:knn(python代码)

    数据 标称型和数值型 算法 归一化处理:防止数值较大的特征对距离产生较大影响 计算欧式距离:测试样本与训练集 排序:选取前k个距离,统计频数(出现次数)最多的类别 def classify0(inX, ...

  2. 机器学习实战(十二)降维(PCA、SVD)

    目录 0. 前言 1. 主成分分析PCA(Principal Component Analysis) 2. 奇异值分解SVD(Singular Value Decomposition) 3. 低维空间 ...

  3. 机器学习实战(11)——初识人工神经网络

    目录 1 感知器 2 多层感知器和反向传播 3 用TensorFlow的高级API训练MLP 4 使用纯TensorFlow训练DNN 4.1 构建阶段 4.2 执行阶段 5 使用神经网络 1 感知器 ...

  4. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

  5. 【阿旭机器学习实战】【11】文本分类实战:利用朴素贝叶斯模型进行邮件分类

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文主要介绍如何使用朴素贝叶斯模型进行邮件分类,置于朴素贝叶斯模型的原理及分类,可以参考我的上一篇 ...

  6. 资料分享:送你一本《机器学习实战》电子书!

    这两天,各985高校发布了考研初试分数线.从中发现这两年大数据相关专业的分数线暴涨啊.没有400分估计心里都没底啊.可见大数据这个领域有多火爆!而机器学习是我们团队的一个主要方向,新加入的同学通常都是 ...

  7. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 ApacheCN - 学习机器学习群[629470233] Machine Learning in ...

  8. apriori算法代码_资源 | 《机器学习实战》及代码(基于Python3)

    〇.<机器学习实战> 今天推荐给大家的是<机器学习实战>这本书. 机器学习作为人工智能研究领域中一个极其重要的研究方向(一文章看懂人工智能.机器学习和深度学习),在当下极其热门 ...

  9. 《机器学习实战》学习笔记

    很久没写过博客了,一重开就给自己挖了这么一个大坑-- 最近一段时间看了<机器学习实战>这本书,感觉写得不错,认真看了看.关于这本书的书评及购买事宜请移步豆瓣.京东.亚马逊等网站,这里不多说 ...

  10. 机器学习实战中的函数学习记录

    title: 机器学习实战中的函数学习记录 date: 2020-05-01 09:20:50 tags: [python函数] categories: 机器学习实战 更多内容请关注我的博客 记录机器 ...

最新文章

  1. http://www.shanghaihaocong.com-WORDPRESS开发的企业主题站
  2. 配置tomcat6.0的HTTPS(单向)
  3. Metal日记:使用步骤指南
  4. 软件测试工程师和WGT,软件系统测试(WGT)工程师---ATK
  5. 多址接入技术TDMA CDMA FDMA Aloha等
  6. 我的k8s随笔:命令实践
  7. python定义函数名typo错误_17个新手常见Python运行时错误
  8. 【转】关于Eclipse创建Android项目时,会多出一个appcompat_v7的问题
  9. 数据库报12516linux,ORA-12516故障解决
  10. ARM架构——面试了菊厂,中兴,MTK,鼎桥,总结了ARM Cortex-M3中断
  11. 菲律宾 软件测试,一个中国学生,2个月的菲律宾游学失败经历自白
  12. 多线段几何图形—— 简单几何图形(判断一个点是否在图形的内部)
  13. cv2.imread不能正常读取gif格式图片
  14. 计算机专业装win几,低配电脑装win10还是win7系统比较合适
  15. 语音识别-基础(一):简介【语音转文本】
  16. canvas-随机粒子特效
  17. 配置Python开发环境
  18. IIS 部署php程序
  19. 人工智能学习笔记 python实现梯度下降法对多元函数求解
  20. java输出GPA_使用ENUM和switch case的循环Java GPA计算器

热门文章

  1. ArcGIS js Api 4.x修改三维球背景技巧
  2. centos最新版solr5.3.1安装和数据整理以及遇到的问题解答
  3. Ubuntu中添加应用程序快速启动器的方法
  4. Bean在Spring和SpringMVC中无所不在
  5. spark学习 小汇集
  6. 六个好用的程序员开发在线工具
  7. 终于找全啦!一二线城市知名互联网公司名单!对着找就对了...
  8. 38张技术知识图谱,IT架构师必备【附下载】
  9. 三年无bug,提升代码质量的秘诀
  10. 都说 NoSQL 比 SQL 强,一文揭密 NoSQL 到底有多强!