需要函数从部分积重建矩阵 E

Need function to re-construct matrix E from the partial product

任务是这样的:

假设具有低 FOV 的组件来自实验噪声。我们想消除这种噪声以获得更高的信噪比。为此,我们可以从部分积中重建矩阵 E Ē = U(f) D(f) V^T(f), 其中下标 (f) 表示删除最后一列。完整的函数细化表达式,使用 SVD,select 只有那些一起解释至少 90% 的方差的第一主成分,并用上面的公式重建矩阵 E。

我这样试过:

def refine_expression(F):
"""
Call:
   Fbar = refine_expression(F)
Input argument:
   F: numpy array (2-d matrix; centered)
Output arguments:
   Fbar: numpy array (2-d matrix) 
Example:
   E,rn,cn = load_data('expressionSet1.dat')
   F = transform(E)
   Fbar = refine_expression(F)
   =>
   Fbar:
   array([[ -0.26696566,  5.27928198,  0.03159005, ...,  0.65700363,
     0.26819583,  0.1807512],
           ...
          [ 0.24213939, -0.48004957, -1.2858063 , ..., -1.18645038,
    -2.01918948,  1.34124707]])

   Ebar.shape == E.shape % test for correctness
   =>
   True
"""
U,d,V = svd(E,full_matrices=False)
n = len(d)
Fbar = dot(dot(U[:,1:n],diag(d[1:n])),V[:,1:n].T)
return(Fbar)

但这里指的是Ē=U(-1)D(-1)V^T(-1)。所以我不知道如何将 f 集成到我的原始函数中,有人可以帮我吗?

奇异值按降序排列,因此您需要做的就是沿着每个矩阵的 'inner' 维度索引第一个 f 值的切片:

# E is (M, N), U is (M, K), s is (K,) and Vt is (K, N), where K = min(M, N)
# f is an integer such that 0 < f < K

U, s, Vt = np.linalg.svd(E, full_matrices=False)
Fbar = U[:, :f].dot(np.diag(s[:f])).dot(Vt[:f, :])

注意np.linalg.svd returns第二个酉矩阵V是转置形式的,所以在计算点积之前不需要再次转置