计算 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)
是 U
和 V
的第 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)
我们现在 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)
是 U
和 V
的第 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)