2015-04-22 54 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