如何从 n: m 的奇异值分解矩阵中找到一个切片,没有圆圈

Posted

技术标签:

【中文标题】如何从 n: m 的奇异值分解矩阵中找到一个切片,没有圆圈【英文标题】:How to find a slice from n: m of singular value decomposition matrix, whithout cicles 【发布时间】:2022-01-21 10:12:01 【问题描述】:

SVD 等于 UΣVT,其中 U - m * k 矩阵,Σ - k * k 对角矩阵,VT - 转置 k * m 矩阵。 UΣVT 也可以确定为 A = u1σ1vT1 + u2σ2vT2 + u3σ3vT3 其中 u1 - U 的第一列,σ1 - Σ 的第一个元素,vT1 - V 的第一列。 Scipy 包含函数 svd(a),它返回 UΣVT。 例如,如何找到没有循环的 a = u2σ2vT2 + u3σ3vT3。

【问题讨论】:

请提供输入示例和预期输出 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

可以通过矩阵乘法进行重构

U, s, VT = la.svd(A)
np.allclose((U * s) @ VT, A)
np.allclose(U @ np.diag(s) @ VT, A)

如果你发现第二个奇异值是s[1],第三个是s[2],如果你给出任意一组索引,你可以将总和重构为

(U[:,indices] * s[indices]) @ VT[indices,:]

以矩阵为例

A = np.diag(np.arange(5))
array([[0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 2., 0., 0.],
       [0., 0., 0., 3., 0.],
       [0., 0., 0., 0., 4.]])

你提到的总和是这样计算的

(U[:,2-1:3] * s[2-1:3]) @ VT[2-1:3,:]
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 2., 0., 0.],
       [0., 0., 0., 3., 0.],
       [0., 0., 0., 0., 0.]])

【讨论】:

以上是关于如何从 n: m 的奇异值分解矩阵中找到一个切片,没有圆圈的主要内容,如果未能解决你的问题,请参考以下文章

奇异值分解(SVD)

奇异值分解的方法

eigen奇异值分解是哪个函数

奇异值怎么求

奇异值分解(SVD)

SVD奇异值分解数学原理