关键字:SVD、奇异值分解、降维、基于协同过滤的推荐引擎
作者:米仓山下
时间:2018-11-3
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
https://github.com/pbharrin/machinelearninginaction

********************************************************************************

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

SVD应用:SVD在数据压缩(如PCA)、于降维算法中的特征分解、推荐算法、潜在语义索引(LSI)等领域都有着广泛的应用

--------------------------------------------------------------------------------------------

一、奇异值分解(SVD)原理

SVD分解与PCA有都可以实现降维,在pca中Ax=λx,如果我们求出了矩阵A的n个特征值λ1≤λ2≤...≤λn,以及这n个特征值所对应的特征向量{w1,w2,...wn},,如果这n个特征向量线性无关,那么矩阵A就可以用下式的特征分解表示:A=WΣW−1。进行特征分解,矩阵A必须为方阵;如果A不是方阵,即行和列不相同时,可以使用SVD。SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:A=UΣVT,其中U是一个m×m,的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足UTU=I,VTV=I。

<1>主成分分析通过对原始数据线性变化,最大化协方差矩阵,使在新的空间内数据的方差最大化(能量集中),特征值分解,对是针对数据列的降维。
<2>SVD分解是非方正条件下对数据进行奇异值分解。左奇异矩阵可以用于行数的压缩,右奇异矩阵可以用于列数即特征维度的压缩。

与PCA相比,SVD也可以得到协方差矩阵XTX最大的d个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不求先求出协方差矩阵XTX,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。在现在的大数据时代,由于SVD可以实现并行化,因此更是大展身手。

PCA的原理及数学推倒可以看【PCA】,SVD的原理和理解看【SVD】
(微信公众号的有些基础文章质量真的是比论坛博客的质量高)

书中对隐形语义的讲解感觉很突兀,我的理解是:其实可以理解为将将一个语义空间去进行分析处理。如在文中餐馆的例子,进行奇异值分解就是:VT矩阵会将用户映射到BBQ/日式食品空间去。U矩阵会将餐馆的菜映射到BBQ/日式食品空间去。自然语言中的奇异值分解形成“概念”后面再慢慢学习

--------------------------------------------------------------------------------------------

二、基于协同过滤的推荐引擎

首先需要说明,推荐引擎有很多方法,协同过滤只是众多场景下的一种,如有基于内容推荐、协同过滤、关联规则(Apriori算法、FPgrowth算法)、混合推荐等。

基于协同过滤的推荐引擎原理:协同过滤(collaborative filtering)是通过将用户和其他用户的数据进行对比来实现推荐的。利用相似物品,基于相似度加权平均求得未评价物品的预测评分,求得未评价物品预测评分的前N高,以此作为推荐项。

SVD(奇异值分解)在协同过滤推荐引擎中的作用是利用U对行数据降维,以解决矩阵稀疏问题,去除了噪声和冗余信息。SVD的作用是:实现了降维,将数据映射/压缩到某个隐形空间,SVD来减少特征空间并提高推荐的效果。可以将奇异值想象成一个新空间。这二维分别是什么呢?能告诉我们数据的什么信息?这二维分别对应图中给出的两个组,右图中已经标示出了其中的一个组。可基于每个组的共同特征来命名这二维,比如得到的美式BBQ和日式食品这二维。

书中首先讲了计算相似度的三种方法,包括欧氏距离、皮尔逊相关系数、余弦相似度。书中计算的是各种餐馆之间的相似度。

接着,就可以利用相似度便可以基于协同过滤进行推荐了,在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数。这就是说,我们认为用户可能对物品的打分(这就是相似度计算的初衷),对这些物品的评分从高到底进行排序,返回前N个物品。

最后,利用SVD提高推荐的效果,解决数据矩阵稀疏问题,并且可以去燥。将用户映射到BBQ/日式食品空间,然后再计算餐馆之间的相似度,加权求为评价商品的得分。

--------------------------------------------------------------------------------------------

三、基于SVD的图像压缩

奇异值分解能够有效的降低数据的维数,图片为例,从450维降到149维后,还保留了90%的信息

原理:
使用SVD来对数据降维,从而实现图像的压缩。在协同过滤推荐引擎中仅使用SVD的左奇异矩阵U,在图像压缩中不仅用到了U还用到了V。一张二维n*m的灰度图片可以看做是n*m的矩阵,利用SVD可以实现对二维图像的压缩。

书中采用了二值化o-1矩阵,对数据进行了SVD压缩,仅保留前两个奇异值的信息,然后采用一个阈值还是把矩阵还原为一个0-1矩阵。(灰度图片和RGB图片的SVD分解下一节介绍)

注意:虽然奇异值分解很有效,但是不能滥用,一般情况下要求降维后信息的损失度不能超过5%,甚至是1%

书中源码
--------------------------------------------------------------------------------------------
参考文献:

刘建平-奇异值分解(SVD)原理与在降维中的应用:https://mp.weixin.qq.com/s/Z0ZkQlZDKUSJEWVq7Vi6Cg  & https://www.cnblogs.com/pinard/p/6251584.html

读书笔记(3) | SVD算法及应用 :https://mp.weixin.qq.com/s/EOmViXqvcIiN2cx5RtHSBg

机器学习实战 第十四章 利用SVD简化数据:https://blog.csdn.net/namelessml/article/details/52987113

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

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

  1. 机器学习实战 [Machine learning in action]

    内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...

  2. 学习笔记之机器学习实战 (Machine Learning in Action)

    机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中 ...

  3. K近邻 Python实现 机器学习实战(Machine Learning in Action)

    算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...

  4. Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记

    Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...

  5. 【python与机器学习实战】感知机和支持向量机学习笔记(一)

    对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...

  6. Machine Learning(Andrew Ng)学习笔记

    1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...

  7. Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)

    我们如今開始训练模型,还输入參数例如以下: rank:ALS中因子的个数.通常来说越大越好,可是对内存占用率有直接影响,通常rank在10到200之间. iterations:迭代次数,每次迭代都会降 ...

  8. Machine Learning With Spark学习笔记(提取10万电影数据特征)

    注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...

  9. 【Python机器学习实战】感知机和支持向量机学习笔记(三)之SVM的实现

    前面已经对感知机和SVM进行了简要的概述,本节是SVM算法的实现过程用于辅助理解SVM算法的具体内容,然后借助sklearn对SVM工具包进行实现. SVM算法的核心是SMO算法的实现,首先对SMO算 ...

随机推荐

  1. cc、gcc、g++、CC的区别和联系

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

  2. Ubuntu 18.0.4安装docker

    第一步:如果之前安装过docker,执行下面命令删除 apt-get remove docker docker-engine docker.io 删除后执行sudo apt-get update更新软 ...

  3. iOS开发笔记-Xcode添加pch文件

    xcode6以后苹果取消了pch文件,需要自己创建pch文件并手动添加引用. 1.新建pch文件 2.项目Build Settings添加引用 最后检查路径是否正确,编译一下查看是否出现问题. 如果出 ...

  4. 脚手架vue-cli系列四:vue-cli工程webpack的基本用法

    webpack的打包依赖于它的一个重要配置文件webpack.config.js,在这个配置文件中就可以指定所有在源代码编译过程中的工作了,就一个配置就可以与冗长的Gruntfile或者Gulpfil ...

  5. 使用Masonry对UIScrollView自动布局

    之前使用Masonry对UIScrollView进行过约束,当时是遇到了问题的,怎么约束都不对,因为赶进度直接改用frame了也没有对问题深究.就这样过了很久.........,直到前一段换工作的时候 ...

  6. C# DataGridview控件自动下拉到最后一行

    有时候使用DataGridView难免会在最后插入一条数据,如果插入的数据超过滚动条显示的行数,那么默认情况下不会显示到最后一行.增加以下代码一直将滚动条拉倒最低. ;

  7. OkHttp3 任务队列

    OkHttp3 有两种运行方式: 1.同步阻塞调用并且直接返回: 2.通过内部线程池分发调度实现非阻塞的异步回调; 下面讲的是非阻塞异步回调,OkHttp在多并发网络下的分发调度过程,主要是Dispa ...

  8. Java NIO中的缓冲区Buffer(二)创建/复制缓冲区

    创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1.调用allocate方法 2.调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义: allocate方法创建缓冲区 调用all ...

  9. C++模板的应用

    需求:类比数组类,只不过数组类型不再是整型.浮点型等,也可以是类. 1.创建模板类 头文件 #ifndef MYVECTOR_H #define MYVECTOR_H #include <ios ...

  10. WINDOWS内核编程(一)Hello Drv的实现

    我们开始编写第一个驱动程序,首先我们需要进行项目的创建,在以前的随笔中,我们已经学会了如何去建立双机调试环境. 我们打开VS2017,建立如图所示的项目,取名为:MyFirstDriver.点击确定 ...