python - 计算 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 列U
,V
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
使用 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)
推荐阅读
- python - 该复选框在未选中时不能返回 False,但在选中时可以返回 True
- python - 在 FastAPI 中请求上下文?
- java - 原因:java.io.FileNotFoundException:无法在类路径上找到 clojure/core__init.class 或 clojure/core.clj
- python - 在顶部和右侧创建另外两个轴后,我无法在两个轴上创建网格线。matplotlib 问题
- android - diffutil areContentsTheSame 函数只比较新项目
- routes - 应该设置什么参数才能使车辆能够通过紧急门?
- angular - 如何使用 jasmine 在 Angular 中测试服务
- python - Numba:初始化一个 jitclass 装饰类的成员生成器
- ansible - ansible jinja2 模板中的内联注释
- vba - 高级搜索文本框(通过多值列搜索)