Làm thế nào để tính toán SVD của một ma trận thưa thớt khổng lồ?


26

Cách tốt nhất để tính toán phân rã giá trị số ít (SVD) của ma trận dương rất lớn (65M x 3,4M) trong đó dữ liệu cực kỳ thưa thớt?

Ít hơn 0,1% của ma trận là khác không. Tôi cần một cách:

  • sẽ phù hợp với bộ nhớ (tôi biết rằng các phương thức trực tuyến tồn tại)
  • sẽ được tính trong thời gian hợp lý: 3,4 ngày
  • sẽ đủ chính xác tuy nhiên độ chính xác không phải là mối quan tâm chính của tôi và tôi muốn có thể kiểm soát số lượng tài nguyên tôi đưa vào đó.

Thật tuyệt vời khi có một thư viện Haskell, Python, C #, vv thực hiện nó. Tôi không sử dụng mathlab hoặc R nhưng nếu cần tôi có thể đi với R.


3
Bạn có bao nhiêu kỷ niệm? 0,1% của 65M * 3,4M vẫn là 221e9 giá trị khác không. Nếu bạn sử dụng 4 byte cho mỗi giá trị, vẫn còn hơn 55 gb, giả sử không có phí, vì vậy độ thưa vẫn không giải quyết được vấn đề ... Bạn có cần tải toàn bộ bộ nhớ vào cùng một lúc không?
Bitwise

Tôi nên đã chính xác hơn. Không quá 250-500mb với số nguyên 32 bit. Có lẽ ít hơn nhiều, nhưng chiều hướng là vấn đề như tôi hiểu nó. Tôi có máy 16GB.
Sonia

Còn cái này thì sao? quora.com/ từ
Bitwise

Trang web này liên kết đến thư viện Python thực hiện "thuật toán SVD nhanh, tăng dần, bộ nhớ thấp, ma trận lớn": en.wikipedia.org/wiki/Latent_semantic_analysis
Bitwise

Câu trả lời:


21

Nếu nó phù hợp với bộ nhớ, hãy xây dựng một ma trận thưa thớt trong R bằng cách sử dụng gói Matrix và thử irlba cho SVD. Bạn có thể chỉ định có bao nhiêu vectơ số ít bạn muốn trong kết quả, đó là một cách khác để hạn chế tính toán.

Đó là một ma trận khá lớn, nhưng tôi đã có kết quả rất tốt với phương pháp này trong quá khứ. irlbalà khá hiện đại. Nó sử dụng thuật toán bi-chéo chéo Lanczos được khởi động lại .

Nó có thể nhai thông qua bộ dữ liệu giải thưởng Netflix (480.189 hàng bằng 17.770 cột, 100.480.507 mục nhập khác không) trong một phần nghìn giây. Bộ dữ liệu của bạn lớn hơn ~ 200.000 lần so với bộ dữ liệu Netflix, do đó mất nhiều thời gian hơn thế. Có thể hợp lý khi hy vọng rằng nó có thể thực hiện tính toán trong một vài ngày.


ma trận dữ liệu phù hợp với bộ nhớ, irlba sẽ xử lý việc phân tách theo cách hiệu quả của bộ nhớ chứ?
Sonia

@Sonia: irlba rất hiệu quả về bộ nhớ: nó tính toán một giải pháp gần đúng, bạn có thể giới hạn số lượng vectơ số ít và nó được thiết kế để hoạt động trên ma trận thưa thớt. Theo như tôi biết, nó sẽ nhanh như bạn sẽ có được để tính toán các SVD một phần.
Zach

@Sonia: Chúc may mắn!
Zach

Đã cho nó dùng thử - hết bộ nhớ ... Tôi sẽ tính toán một dạng khối tam giác trước khi chạy nó.
Sonia

@Sonia bạn có lưu trữ dưới dạng thưa thớt Matrixkhông? Hãy thử giới hạn số lượng giá trị số ít bạn tính toán ... có thể chỉ cần nhìn vào top 10?
Zach

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.