about云开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1357|回复: 1

[连载型] Spark 高级分析:第六章第6节 奇异值分解

[复制链接]

84

主题

12

听众

1

收听

版主

Rank: 7Rank: 7Rank: 7

积分
1273
发表于 2018-6-8 10:12:21 | 显示全部楼层 |阅读模式
本帖最后由 feilong 于 2018-6-15 09:30 编辑
问题导读

1.什么是奇异值分解?
2.SVD是什么?
3
.如何利用MLib得到奇异分解值?








一篇:Spark 高级分析:第六章第4,5节 词形还原并计算TF-ID
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24594&extra=



随着M -文档矩阵M的存在,分析可以进行分解和降维。MLlib包含一个可以处理巨大矩阵的奇异值分解(SVD)的实现。奇异值分解得到一个m×n矩阵,并返回三个矩阵,它们在相乘时近似等于它。
M≈USV T
•U是一个mxk矩阵,它的列构成了文档空间的标准正交基。
•S是一个k×k的对角矩阵,每个元素的分量对应于其中一个概念的强度。
•V是一个k×n矩阵,它的列构成了术语空间的标准正交基。

在LSA案例中,m是文档数,n是项的个数。分解的参数是k,小于或等于n,表示要保留多少概念。当k = n时,因子矩阵的乘积完全重新构成原矩阵。当k < n时,乘法会导致原始矩阵的低阶近似。k通常选择远小于n。圣言会确保近似将最可能的原始矩阵(按照L2范数的定义,即平方和,的区别),考虑到约束,它只需要使用k的概念。

为了找到矩阵的奇异值分解,只需将行向量的RDD封装在一个行矩阵中,并调computeSVD:

[Scala] 纯文本查看 复制代码
import org.apache.spark.mllib.linalg.distributed.RowMatrix
termDocMatrix.cache()
val mat = new RowMatrix(termDocMatrix)
val k = 1000
val svd = mat.computeSVD(k, computeU=true)


RDD应该在内存中缓存,因为计算需要多次传递数据。计算需要在驱动器上的O(nk)存储,O(n)存储每个任务,O(k)传递数据。

在此提醒,词语空间中的向量表示每一项都有分量的向量,文档空间中的向量表示每个文档都有分量的向量,概念空间中的向量表示每一个概念都有分量的向量。每个词语、文档或概念在各自的空间中定义了一个轴,而将其归因于术语、文档或概念的权重则意味着沿着该轴的长度。每个术语或文档向量都可以映射到概念空间中的对应向量。每个概念向量都有可能包含许多词语和文档向量,包括它映射到的一个规范术语和文档向量。

V是一个n×k矩阵,每一行对应一个词语,每一列对应一个概念。它定义了词语空间之间的映射(每个点都是一个n维向量的空间)和概念空间(每个点都是一个k维向量,为每个概念保持一个权重)。

类似地,U是一个mxk矩阵,其中每一行对应一个文档,每个列对应一个概念。它定义了文档空间和概念空间之间的映射。

S是一个包含奇异值的k×k对角矩阵。S中的每一个对角元素都对应一个单一的概念(因此是V中的一列和U中的一列)。这些奇异值的大小对应于这个概念的重要性,它的力量解释了数据中的方差。圣言所能找到的(效率低)实现从rank-n k位分解的分解和扔掉n - k最小奇异值,直到有k离开(连同相应的列在U和V)。LSA的关键洞见是,只有少量的概念代表数据是很重要的。S矩阵中的项直接表示每个概念的重要性。它们也恰好是T的特征值的平方根。


本帖被以下淘专辑推荐:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|about云开发-学问论坛|社区 ( 京ICP备12023829号

GMT+8, 2018-10-20 12:44 , Processed in 0.382619 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2 Licensed

快速回复 返回顶部 返回列表