2015-04-22 53 views
0

任务是这样的:需要函数从部分产品重构矩阵E

假设具有低FOV的分量来自实验噪声。我们希望消除这种噪音以实现更高的信噪比。为了做到这一点,我们可以从部分产品E = U(f)D(f)V^T(f), 中重新构造矩阵E,其中下标(f)表示拒绝最后一列。完整的函数精化表达式,使用SVD,只选择那些一起解释至少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集成到我的原始功能中,有人能帮我解决吗?

+0

也许我的理解不正确,但是'n = len(d) - ...',那么你减去你想删除的列数? – EOL

+0

另外,不要忘记,Python索引从0开始,而不是1 –

回答

0

的奇异值按降序排列给出,因此,所有你需要做的是索引中的第一˚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以换位形式返回第二个酉矩阵V,所以在计算点积之前不需要再次转置它。

+0

非常感谢您的回答!我试图使用你的代码,但现在我得到一个错误:Fbar = U [:,:f] .dot(np.diag(s [:f]))。dot(Vt [:f,:]) IndexError:无效片你看到有什么问题吗? – Veysel

+0

那么,你没有告诉我什么是'f'。它应该是一个介于0和“E”最小维度大小之间的整数标量(我已经添加了关于每个矩阵的维度以便答案的注释)。 –

+0

是的,对不起。在上一个任务中,我们必须完成另一个名为compute_fov的函数,其中指定了f:'def compute_fov(d): fov = compute_fov(d) 输入参数: d:numpy数组(1-d向量) 输出参数: FOV:numpy的阵列(解释方差的分数) 实施例: E,RN,CN = load_data( 'expressionSet1.dat') d,V,U = do_pca(E) F = compute_fov(d) fov = d ** 2/sum(d ** 2) return(fov)'所以虽然我在我的控制台中首先使用这个f,但它不起作用。 – Veysel