首页 > 解决方案 > 计算 SVD 分量的总和

问题描述

我们现在知道A_(m x n) = U_(m x k) * S_(k x k) * V_(k x n)^T = u_(1) * s_1 * v_(1) + u_(2) * s_2 * v_(2) + ...,,在哪里u_(i)v(i)是和的第 i 列UVs_i - S 的第 i 个对角线元素。我试图在不使用循环的情况下获得一个数组 a,a[i] = u_(1) * s_1 * v_(1) + u_(2) * s_2 * v_(2) + ... + u_(i) * s_i * v_(i).接下来我应该在哪里做什么?

from numpy.linalg import svd

U, S, VT = svd(A, full_matrices=False)
A_1 = U[:, 0:1] * S[0] @ VT[0:1]

标签: pythonnumpysvd

解决方案


一种简单的方法是einsum

A_ = np.einsum("ij,j,jk->jik",U[:,:len(VT)],S,VT[:len(U)]).cumsum(0)

如果您明智地svd使用 this 来调用它,full_matrices=False则简化为

A_ = np.einsum("ij,j,jk->jik",U,S,VT).cumsum(0)

A_1将对应于A_[0]等,A_[-1]是(最多汇总)原始数组A

PS:基本相同,没有einsum

A_ = ((U*S).T[:,:,None]*VT[:,None,:]).cumsum(0)

推荐阅读