【问题标题】:Calculate sum of SVD components计算 SVD 分量的总和
【发布时间】:2019-05-24 02:16:26
【问题描述】:

我们现在 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]

【问题讨论】:

    标签: python numpy svd


    【解决方案1】:

    一个简单的方法是einsum:

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

    如果您明智地使用full_matrices=False 调用了svd,这将简化为

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多