44 | 奇异值分解:如何挖掘潜在的语义关系?
该思维导图由 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’iVi=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-1632 - qinggeouyeimport 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-0322 - !nullU 是一个 m×m 维的矩阵,V 是一个 n×n 维的矩阵。而 Σ 是一个 m×n 维的矩阵 上边m×m和n×n意思是m阶和n阶方阵吗?如果是,为什么lsa的例子里,就是计算机文档和医学文档的例子里,U和V都不是方阵,而 Σ 是个方阵?
作者回复: 这是因为后面的奇异值都为0,当然计算机文档和医学文档的例子是理想状况。实际数据中,往往还有较小的奇异值在后面,所以Σ矩阵不是2x2
2021-08-301 - !nullσ[i]=(X*v[i])/u[i] 这个公式后边怎么算没看懂。X应该是最开始的矩阵,v[i]和u[i]是特征向量吗?那X*u[i]结果应该也是向量。最后就是两个向量之间做除法。向量间除法应该怎么算?
作者回复: 元素对应的除法
2021-08-301 - !null其中 U 是一个 m×m 维的矩阵,V 是一个 n×n 维的矩阵。而 Σ 是一个 m×n 维的矩阵,对于 Σ 来说,只有主对角线之上的元素可以为非 0,其他元素都是 0,而主对角线上的每个元素就称为奇异值。 后边“计算机文档和医学文档”奇异值分解之后,没觉得U是 m×m 维的矩阵,V 是一个 n×n 维的矩阵,Σ 是一个 m×n 维的矩阵。如果Σ有对角线的话,是不是Σ 应该是个方阵?
作者回复: Σ通常不是方阵,其对角线是由Σ(i,i)组成。
2021-08-231 - Paul Shan文档例子和svd分解有差别,svd是左右为方阵,中间为非方阵。文档例子是中间为方阵,左右为方阵,我感觉这里缺了一步,是不是文档的例子已经是降维后的结果了?
作者回复: 你是指最后的文档集合的那个例子?对,这是分解后的结果
2019-10-1121 - 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-213 - 骑行的掌柜J又get到一个新的知识点 奇异值SVD😁虽然有疑惑这里“就有 ∣∣Vi∣∣2=1,而这表示 V’iVi=1,此时 V 的 n 个特征向量为标准正交基” 不过已经有好几个朋友提问出来 老师也解答了 剩下就是熟练这个过程 谢谢黄老师 PS: 如果有SVD奇异值分解项目案例就更好了
作者回复: 后面实战部分有一个案例供你参考
2020-07-09