计算 SVD 组件的总和

Calculate sum of SVD components

我们现在 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)UV 的第 i 列,s_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]

一个简单的方法是 einsum:

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

如果正如您明智地所做的那样,svd 是用 full_matrices=False 调用的,这将简化为

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

您的 A_1 将对应于 A_[0] 等,A_[-1] 是(向上汇总)原始数组 A.

P.S.: 没有einsum基本相同:

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