2011-08-22 16 views
5

Tôi đang cố gắng áp dụng SVD trên ma trận (3241 x 12596) sau khi xử lý văn bản (với mục tiêu cuối cùng là thực hiện Phân tích ngữ nghĩa tiềm ẩn) và tôi không thể hiểu tại sao điều này xảy ra với máy 64 bit của tôi có RAM 16 GB. Khoảnh khắc svd(self.A) được gọi, nó ném một lỗi. Các lỗi chính xác được đưa ra dưới đây:Áp dụng SVD sẽ ném ngay một Lỗi Bộ nhớ?

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 81, in svd 
    overwrite_a = overwrite_a) 
MemoryError 

Vì vậy, tôi đã cố gắng sử dụng

self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 

và lần này, nó ném các lỗi sau:

Traceback (most recent call last): 
    File ".\SVD.py", line 985, in <module> 
    _svd.calc() 
    File ".\SVD.py", line 534, in calc 
    self.U, self.S, self.Vt = svd(self.A, full_matrices= False) 
    File "C:\Python26\lib\site-packages\scipy\linalg\decomp_svd.py", line 71, in svd 
    return numpy.linalg.svd(a, full_matrices=0, compute_uv=compute_uv) 
    File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 1317, in svd 
    work = zeros((lwork,), t) 
MemoryError 

Đây có phải là nghĩa vụ phải được như vậy một lớn ma trận mà Numpy không thể xử lý và có một cái gì đó mà tôi có thể làm ở giai đoạn này mà không thay đổi phương pháp chính nó?

+0

Bộ nhớ sử dụng bao nhiêu bộ nhớ tại thời điểm nó cố gắng tính toán SVD? Bạn đang chạy Python 32 bit hoặc 64 bit? –

+0

@Ferdinand Beyer: Nó đang sử dụng 380 MB khi nó bị treo. Ah! :(Tôi đang sử dụng Python 32 bit. Tôi sẽ tiếp tục và cài đặt phiên bản 64 bit – Legend

+0

@Ferdinand Beyer: Bạn là một vị cứu tinh thực sự! – Legend

Trả lời

2

Dường như, hóa ra, nhờ @Ferdinand Beyer, tôi không nhận thấy rằng tôi đang sử dụng phiên bản Python 32 bit trên máy 64 bit của mình.

Sử dụng phiên bản Python 64 bit và cài đặt lại tất cả các thư viện đã giải quyết được sự cố.

8

Vâng, full_matrices tham số để scipy.linalg.svd là quan trọng: đầu vào của bạn là rất cao cấp bậc thiếu (rank max 3241), do đó bạn không muốn phân bổ toàn bộ ma trận 12.596 x 12.596 cho V!

Quan trọng hơn, ma trận đến từ xử lý văn bản có thể là rất thưa thớt. Các scipy.linalg.svd là dày đặc và không cung cấp SVD cắt ngắn, mà kết quả trong một) hiệu suất bi thảm và b) rất nhiều bộ nhớ lãng phí.

Hãy xem gói sparseSVD từ PyPI, hoạt động trên đầu vào thưa thớt và bạn chỉ có thể yêu cầu các yếu tố hàng đầu K. Hoặc thử scipy.sparse.linalg.svd, mặc dù điều đó không hiệu quả và chỉ có sẵn trong các phiên bản mới hơn của scipy.

Hoặc, để tránh hoàn toàn chi tiết về các chi tiết, hãy sử dụng gói có hiệu quả LSA cho bạn một cách minh bạch, chẳng hạn như gensim.

Các vấn đề liên quan