分享

Spark 高级分析:第六章第6节 奇异值分解

feilong 2018-6-8 10:12:21 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 5421
本帖最后由 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:

[mw_shl_code=scala,true]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)[/mw_shl_code]

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)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条