第14章 利用SVD简化数据

SVD(Singular Value Decomposition)奇异值分解

14.1  SVD的应用

利用SVD实现,我们可以用小得多的数据集来表示原始数据集,这样可以去除噪声和冗余信息。所以我们可以把SVD看成从有噪声的数据中抽取相关特征。

14.1.1  隐性语义分析

最早的SVD应用之一就是信息检索。我们称利用SVD的方法为隐性语义索引(LSI)或隐性语义分析(LSA)。在LSI中,一个矩阵有文档和词语组成,当我们在这个矩阵上应用SVD时,就会构建出多个奇异值。这些奇异值代表文档中的概念或主题。

14.1.2  推荐系统

SVD的另一个应用是推荐系统。简单版本的推荐系统是计算物品或用户之间的相似度。更先进的是利用SVD从数据中构建一个主题空间,然后再此空间下计算相似度。

SVD是矩阵分解的一种类型,而矩阵分解是将数据矩阵分解为多个独立部分的过程。

14.2  矩阵分解

很多情况下,数据中的一小段携带了数据集中的大部分信息,其他信息可能是噪声或毫不相关的信息。在线性代数重有很多矩阵分解技术。矩阵分解就是把原始矩阵表示成新的易于处理的形式,可能是两个或三个矩阵的乘积。

不同的矩阵分解技术有不同的性质,适合于不同的应用。SVD是常见是一种矩阵分解技术。它将原始矩阵分解为三个矩阵乘积:A(m*n)=B(m*m)*C(m*n)*D(n*n)。其中,矩阵C只有对角元素,其他元素为0,且其对角元素是从大到小排列的,这些对角元素称为奇异值,它对应了原始矩阵A的奇异值。

在科学和工程中,有这么一个普遍事实:在某个奇异值的数目r之后,其它奇异值就设置为0。这意味着数据集中仅有r个重要特征,其它特征都是噪声或冗余特征。

14.3  利用Python实现SVD

NumPy有一个称为linalg的线性代数工具箱,可以实现SVD。


可以看到矩阵Sigma以行向量array形式返回,而非矩阵。因为矩阵非对角元素全是0,这种只返回对角元素的方式可以节省空间。


可以看到,奇异值的前两个比后三个大很多,可以只保留前两个奇异值,然后计算近似矩阵。我们重构了原始矩阵的近似矩阵,只需要用到了矩阵U的前3列和VT的前3行。

如何确定该保留前多少个奇异值呢?两个策略。一:保留矩阵中90%的能量信息,为了计算总能量信息,我们将所有奇异值求平方和,将奇异值的平方和累加到总之的90%即可。二:当有上万个奇异值时,保留前2000或3000个就行,虽然不能保证前3000个奇异值包含90%能量信息,但是如果多数据充分了解,就可以做出类似假设。

有很多应用可以通过SVD来提升性能,比如下面将要讨论的-推荐引擎。

14.4  基于协同过滤的推荐引擎

协同过滤(collaborative filtering)是通过将用户和其他用户数据进行对比来实现推荐的。

当我们知道两个用户或者两个物品的相似度时,就可以利用已有数据来预测未知用户的喜好。所以,问题就在于相似度的计算。

14.4.1  相似度计算

这里相似度计算主要介绍三种方法,并且都将相似度的值归一化到0~1之间。

欧氏距离:字面意思。。。两个向量的欧氏距离。。。相似度=1/(1+距离),使其归一化。

皮尔逊相关系数:度量的是两个向量的相似度,在NumPy中用函数corrcoef()计算得出。使用0.5+0.5*corrcoef()归一化。

余弦相似度:计算两个向量夹角的余弦值。夹角90度,相似度为0,方向相同,相似度为1。


不同计算方法的结果

14.4.2  基于物品的相似度还是基于用户的相似度?

大多数情况下,是基于物品的相似度,因为往往用户数量远大于物品数量。

14.5  示例:餐馆菜肴推荐系统

此餐馆推荐系统关注的是餐馆食物的推荐。它可以寻找用户没有尝过的菜肴,通过SVD减少特征空间并提高推荐效果。之后,可以将程序打包通过用户可读的人机交互界面提供给人们使用。

14.5.1  推荐未尝过的菜肴

推荐系统的工作流程是:给定一个用户,系统会为此用户返回N个最好的推荐菜。为了实现这一点,需要做到:

(1)寻找用户没有评级的菜肴,即在用户-物品矩阵中的0值。

(2)在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数。即预测用户可能打出的分数。

(3)对这些物品的评分从高到底排列,返回前N个物品。


默认推荐的结果

推荐系统对用户2(即myMat矩阵第3行)没有评级的餐馆(即为0值)进行了预测。结果中打印出未评级餐馆与其他餐馆相似度,最终给出对没有评级餐馆的预测评级,并且是按评级分数从大到小排序的。上图试验了三种不同相似度方法下的预测结果。

14.5.2  利用SVD提高推荐效果

实际的数据集肯定比上一小节用到的大得多,也稀疏的多。下面我们计算一个很大矩阵的SVD来了解到底需要多少维特征。

可以看到有很多奇异值,而前三个奇异值包含了90%以上的总能量。那么我们就可以将之前的高维度矩阵转换成3维矩阵。利用SVD将所有菜肴映射到低维空间中,在低维空间下,我们可以利用前面相同的相似度计算方法来进行推荐。

不做SVD分解时用余弦相似度计算方法的推荐结果
做SVD分解时用余弦相似度计算方法的推荐结果
做SVD分解时用皮尔逊相似度计算方法的推荐结果
做SVD分解时用欧氏距离相似度计算方法的推荐结果

14.5.3  构建推荐引擎面临的挑战

推荐引擎中存在很多规模扩展性的挑战性问题,比如矩阵表示方法。在实际系统中0的数目非常多,我们可以只存储非零元素来节省内存和计算开销。另一个计算资源浪费是相似度计算得分,每次我们需要一个推荐得分时,都要计算多个物品之间的相似度,而这些信息可以被另一个用户重复利用,所以在实际中,普遍做法是离线计算并保存相似度得分。

推荐引擎面临的另一个问题是如何在缺乏数据时给出好的推荐。这称为冷启动问题。不赘述啦~

14.6  示例:基于SVD的图像压缩

在代码库里,我们有一张手写的数字图像。原始图像大小为32*32=1024像素。我们可以使用SVD来对数据降维,对图像压缩可以节省空间或带宽开销。

原始图像

imgCompress函数可以基于任意给定的奇异值数目来重构图像。我们给定的是2,即取前两个奇异值来重构图像。得到结果如下:

利用SVD分解并重构后的图像

可以看到,只需要两个奇异值就可以较精确地对图像实现重构。而我们所需要的数字数目是64+64+2=130。和原来的1024个数目相比,获得了几乎10倍的压缩比。

14.7  本章小结

SVD是一种强大的降维工具,我们可以利用SVD来逼近矩阵并从中提取重要特征。通过保留矩阵中80%~90%的能量,就可以得到重要的特征并去除噪声。SVD已经应用到很多应用中,其中之一就是推荐系统。

推荐引擎将物品推荐给用户,协同过滤是一种基于用户喜好或行为数据的推荐的实现方法。协同过滤的核心是相似度计算方法,有很多相似度计算方法都可以用于计算物品或用户之间的相似度。通过在低维空间下计算相似度,SVD提高了推荐系统引擎的效果。

在大规模数据集上,SVD的计算和推荐是一个困难的的工程问题。通过离线方式来进行SVD分解和相似度计算,是一种减少冗余计算和推荐所需时间的方法。下一章会介绍在大数据集上进行机器学习的一些工具。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容