2013-11-02 49 views
4

我有100萬個3d點,我正在傳給numpy.linalg.svd,但它很快就耗盡內存。有沒有辦法將這個操作分解成更小的塊?有沒有辦法防止numpy.linalg.svd內存不足?

我不知道它在做什麼,但我只是想傳遞代表3x3,4x4矩陣的數組?因爲我已經在網上看到了它在傳遞具有任意數量元素的數組時使用它的情況。

+1

從文檔'svd'需要'2-D數組'作爲輸入。看來你需要更少的內存,如果你通過'full_matrices = False' ... –

+0

這有幫助,它會給出完全相同的結果,但?我得到了同樣的結果,但對論點的描述對我沒有意義。 –

回答

1

如果你有一個MxN在你的情況下1000000x3矩陣numpy.linalg.svd不需要M == N。實際上,這正是SVD可以用來計算諸如秩和僞逆的東西的地方。像linalg.inv這樣的方法需要一個正方形(和滿秩)矩陣來定義一個結果。

@Saullo卡斯特羅是對的。 full_matrices = False可能變得難以處理,因爲不是U矩陣爲1Mx1M元素,而是1Mx3,這是巨大的節省。我不確定減少的SVD算法numpy使用的是什麼(我認爲它可能是Compact SVD,或者瘦):3個廣泛使用的簡要說明在維基百科上:http://en.wikipedia.org/wiki/Singular_value_decomposition在Reduced SVDs部分。他們都以減少完整U矩陣的計算爲中心,將其縮減爲一個簡化形式,這對於一些甚至許多問題來說已經足夠了。數量觀察>> numberFeatures

節省最多關於是否得到相同的結果。簡短的答案可以是肯定的,具體取決於你將如何處理SVD結果。例如,您可以像原始一樣使用簡化形式返回相同的矩陣(浮點公差級別),如下面的代碼所示。注意在頂部情況下,U的大小是numberObservationsx numberObservations,而在full_matrices = False中,U的大小是numberObservations x numberFeatures

該代碼是根據numpy.linalg.svd文檔改編的,以允許一個人進行實驗用任意的行/列,單值來選擇。

可以總是將U矩陣的大小減小到M x min(M,N)。根據您的數據結構和存在多少噪音,可能會進一步減少。僅僅因爲numpy.isclose錯誤並不意味着計算出來的SV對所有的上下文都不好。您可以使用mostSignificantSingularValues變量進行實驗,該變量取自完整SVD的最高SV。

numberObservations = 900 
numberFeatures = 600 
mostSignificantSingularValues = 600 

a = np.random.randn(numberObservations, numberFeatures) + 1j*np.random.randn(numberObservations, numberFeatures) 

#Reconstruction based on full SVD: 

U, s, V = np.linalg.svd(a, full_matrices=True) 
print(U.shape, V.shape, s.shape) 
S = np.zeros((numberObservations, numberFeatures), dtype=complex) 
S[:mostSignificantSingularValues, :mostSignificantSingularValues] = np.diag(s[:mostSignificantSingularValues]) 
print(np.allclose(a, np.dot(U, np.dot(S, V)))) 
d1 = a - np.dot(U, np.dot(S, V))# 
#True 

#Reconstruction based on reduced SVD: 

U, s, V = np.linalg.svd(a, full_matrices=False) 
print(U.shape, V.shape, s.shape) 
S = np.diag(s) 
print(np.allclose(a, np.dot(U, np.dot(S, V)))) 

d2 = a - np.dot(U, np.dot(S, V))# 
0

嘗試使用scipy.linalg.svd而不是numpy的功能。

相關問題