程序员的数学基础课
黄申
LinkedIn 资深数据科学家
83374 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
导读 (1讲)
基础思想篇 (18讲)
程序员的数学基础课
15
15
1.0x
00:00/00:00
登录|注册

44 | 奇异值分解:如何挖掘潜在的语义关系?

思考题
总结
潜在语义分析和SVD
矩阵的奇异值分解
方阵的特征分解
SVD奇异值分解

该思维导图由 AI 生成,仅供参考

你好,我是黄申。
今天,我们来聊另一种降维的方法,SVD 奇异值分解(Singular Value Decomposition)。它的核心思路和 PCA 不同。PCA 是通过分析不同维度特征之间的协方差,找到包含最多信息量的特征向量,从而实现降维。而 SVD 这种方法试图通过样本矩阵本身的分解,找到一些“潜在的因素”,然后通过把原始的特征维度映射到较少的潜在因素之上,达到降维的目的。
这个方法的思想和步骤有些复杂,它的核心是矩阵分解,首先,让我们从方阵的矩阵分解开始。

方阵的特征分解

在解释方阵的分解时,我们会用到两个你可能不太熟悉的概念:方阵和酉矩阵。为了让你更顺畅的理解整个分解的过程,我先给你解释下这两个概念。
方阵(Square Matrix)是一种特殊的矩阵,它的行数和列数相等。如果一个矩阵的行数和列数都是 n,那么我们把它称作 n 阶方阵。
如果一个矩阵和其转置矩阵相乘得到的是单位矩阵,那么它就是一个酉矩阵(Unitary Matrix)。
其中 X’表示 X 的转置,I 表示单位矩阵。换句话说,矩阵 X 为酉矩阵的充分必要条件是 X 的转置矩阵和 X 的逆矩阵相等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SVD奇异值分解是一种重要的降维方法,通过对文档-词条矩阵进行SVD分解,LSA能够发掘词和词之间的语义关系,并过滤掉原始向量空间中的一些“噪音”,提高信息检索和机器学习算法的精确度。SVD奇异值分解巧妙地运用了矩阵X和自己的转置相乘,生成了两种对称的方阵,并通过这两者的特征分解,获得了SVD中的左奇异向量所组成的矩阵U和右奇异向量所组成的矩阵V,并最终推导出奇异值矩阵Σ。这样,SVD就可以对原始的数据矩阵进行分解,并运用最终的奇异向量进行降维。LSA的分解不仅可以帮助我们找到词条之间的语义关系,还可以降低向量空间的维度,从而更有效地运行其他的信息检索或者机器学习算法。 SVD奇异值分解在不同的应用场景下,$U,V$和$Σ$代表了不同的含义。例如,在LSA分析中,通过对词条和文档矩阵的SVD分解,我们可以利用Σ获得代表潜在语义的一些概念。而矩阵$U$表示了这些概念和文档之间的关系,矩阵$V$表示了这些概念和单个词语之间的关系。 SVD奇异值分解是一种强大的工具,对于理解和处理多维数据具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 南边
    把 V 的这 n 个特征向量进行标准化处理,那么对于每个特征向量 Vi​,就有 ∣∣Vi​∣∣2​=1,而这表示 V’i​Vi​=1,此时 V 的 n 个特征向量为标准正交基,满足 V’V=I , 也就是说 V 为酉矩阵 对于V是酉矩阵这个推导还是不太理解

    作者回复: x1...xn标准化之后,就意味着数据的分布呈现标准正态分布,均值为0,标准差为1。所有就有(x1-0)^2+...+(xn-0)^2=1,也就是∣∣Vi​∣∣2​=1。所以V'iVi=1,而这个1正好是矩阵V'V对角线上的值,对角线上全部为1,其他值全为0,所以V'V = I(单位矩阵)

    2020-01-16
    3
    2
  • qinggeouye
    import numpy as np from numpy import linalg as la # 文档集合 文档和词条关系矩阵 行表示文档 列表示词条 x = np.mat([[1, 1, 1, 0, 0], [2, 2, 2, 0, 0], [1, 1, 1, 0, 0], [5, 5, 5, 0, 5], [0, 0, 0, 2, 2], [0, 0, 0, 3, 3], [0, 0, 0, 1, 1]]) U, sigma, VT = la.svd(x) print(U, "\n") print(sigma, "\n") print(VT, "\n") S = np.zeros((7, 5)) # 奇异矩阵 for i in range(len(sigma)): S[i, i] = sigma[i] print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT.transpose())) 这里计算出的左奇异矩阵、奇异值矩阵、右奇异值矩阵,以及它们的点乘,与本文中的都不太一样,不知哪里出问题了?

    作者回复: 你原来的代码里有两个误输入, 1. x矩阵中的[5, 5, 5, 0, 5]应该是[5, 5, 5, 0, 0] 2.print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT.transpose()))应该是print(" 与矩阵 x 一致? \n", U.dot(S).dot(VT)),这里VT已经转置过了。 这样得到的奇异值是[9.64365076e+00 5.29150262e+00 7.52989891e-16 0.00000000e+00 0.00000000e+00],后面3个接近0,忽略不计

    2019-04-03
    2
    2
  • !null
    U 是一个 m×m 维的矩阵,V 是一个 n×n 维的矩阵。而 Σ 是一个 m×n 维的矩阵 上边m×m和n×n意思是m阶和n阶方阵吗?如果是,为什么lsa的例子里,就是计算机文档和医学文档的例子里,U和V都不是方阵,而 Σ 是个方阵?

    作者回复: 这是因为后面的奇异值都为0,当然计算机文档和医学文档的例子是理想状况。实际数据中,往往还有较小的奇异值在后面,所以Σ矩阵不是2x2

    2021-08-30
    1
  • !null
    σ[i]=(X*v[i])/u[i] 这个公式后边怎么算没看懂。X应该是最开始的矩阵,v[i]和u[i]是特征向量吗?那X*u[i]结果应该也是向量。最后就是两个向量之间做除法。向量间除法应该怎么算?

    作者回复: 元素对应的除法

    2021-08-30
    1
  • !null
    其中 U 是一个 m×m 维的矩阵,V 是一个 n×n 维的矩阵。而 Σ 是一个 m×n 维的矩阵,对于 Σ 来说,只有主对角线之上的元素可以为非 0,其他元素都是 0,而主对角线上的每个元素就称为奇异值。 后边“计算机文档和医学文档”奇异值分解之后,没觉得U是 m×m 维的矩阵,V 是一个 n×n 维的矩阵,Σ 是一个 m×n 维的矩阵。如果Σ有对角线的话,是不是Σ 应该是个方阵?

    作者回复: Σ通常不是方阵,其对角线是由Σ(i,i)组成。

    2021-08-23
    1
  • Paul Shan
    文档例子和svd分解有差别,svd是左右为方阵,中间为非方阵。文档例子是中间为方阵,左右为方阵,我感觉这里缺了一步,是不是文档的例子已经是降维后的结果了?

    作者回复: 你是指最后的文档集合的那个例子?对,这是分解后的结果

    2019-10-11
    2
    1
  • marcus1877
    “第三步,对 SVD 分解后的矩阵进行降维,这个操作和 PCA 主成分分析的降维操作是类似的。” 是对SVD分解后的U,V',∑ 降维吗?

    作者回复: 具体来说,是利用U,V',∑,对原始的矩阵进行降维。比如原来的矩阵是100万用户对应10万商品的关系,那么降维后,可以看做是1万用户组对应1000商品的关系这种。

    2021-03-31
  • 建强
    思考题:请教一下老师,SVD中的奇异值矩阵,能否用U'XV来计算,因为UU'=I, 所以对于等式X = UΣV',分别用U'和V对等式两边进行左乘和右乘,就得到Σ = U'XV,不知这样推导是否正确? 用Python简单写了一个SVD分解的程序,源代码如下: def SVD_Solve(X): # 计算U矩阵 = XX'的特征矩阵 U = X.dot(X.T) U_feature, U_vector = LA.eig(U) # 计算V矩阵 = X'X的特征矩阵 V = X.T.dot(X) V_feature, V_vector = LA.eig(V) # 计算西格码对角矩阵 = U'XV XGM = (U_vector.T.dot(X)).dot(V_vector) return U_vector, XGM, V_vector.T #测试 X = mat([[1,1,1,0,0] ,[2,2,2,0,0] ,[1,1,1,0,0] ,[5,5,5,0,0] ,[0,0,0,2,2] ,[0,0,0,3,3] ,[0,0,0,1,1] ] ) U,XGM,V = SVD_Solve(X) print("左奇异向量\n","="*10, "\n", U) print("奇异值矩阵\n","="*10, "\n", XGM) print("右奇异向量\n","="*10, "\n", V)

    作者回复: 确实是这样的,你可以比较这个程序的输出,和Python sklearn等库输出的结果,看看是否一致

    2020-11-29
  • 不接地气的马三岁
    算方差的时候,不应该还有个1/N吗,N是元素个数,(x1-0)^2+...+(xn-0)^2为什么不等于N。

    作者回复: 你好,这个问题是针对PCA分析还是SVD分解?

    2020-07-21
    3
  • 骑行的掌柜J
    又get到一个新的知识点 奇异值SVD😁虽然有疑惑这里“就有 ∣∣Vi​∣∣2​=1,而这表示 V’i​Vi​=1,此时 V 的 n 个特征向量为标准正交基” 不过已经有好几个朋友提问出来 老师也解答了 剩下就是熟练这个过程 谢谢黄老师 PS: 如果有SVD奇异值分解项目案例就更好了

    作者回复: 后面实战部分有一个案例供你参考

    2020-07-09
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部