Büyük seyrek bir matrisin SVD'si nasıl hesaplanır?


26

Verilerin son derece seyrek olduğu çok büyük bir pozitif matrisin (65M x 3.4M) tekil değer ayrışmasını (SVD) hesaplamanın en iyi yolu nedir?

Matrisin% 0.1'inden daha azı sıfır değildir. Bir yola ihtiyacım var:

  • belleğe sığacak (çevrimiçi yöntemlerin olduğunu biliyorum)
  • Makul bir sürede hesaplanacak: 3,4 gün
  • Yeterince doğru olacağım ancak doğruluk benim asıl meselem değil ve ne kadar kaynak koyduğumu kontrol edebilmek istiyorum.

Uygulayan bir Haskell, Python, C # vs. kütüphanesine sahip olmak harika olurdu. Ben matematik veya R kullanmıyorum ama gerekirse R ile gidebilirim.


3
Ne kadar hafızanız var? 65M * 3.4M'in% 0.1'i hala 221e9 sıfır olmayan değerlerdir. Değer başına 4 bayt kullanırsanız, bu hala fazladan bir yük olmadığını varsayarak 55 gb'den fazladır, bu nedenle sparsity hala sorunu çözmüyor ... Tüm seti bir seferde belleğe yüklemeniz mi gerekiyor?
Bitwise

Daha kesin olmalıydım. 32 bit tamsayı ile 250-500 MB'den fazla değil. Muhtemelen çok daha az, ama boyutsallık benim anladığım kadarıyla problem. 16GB'lık bir makinem var.
Sonia

Buna ne dersin? quora.com/...
Bitwise

Bu web sayfası "hızlı, artımlı, düşük hafızalı, geniş matrisli bir SVD algoritması" uygulayan bir Python kütüphanesine bağlantı vermektedir: en.wikipedia.org/wiki/Latent_semantic_analysis
Bitwise

Yanıtlar:


21

Belleğe uyarsa , Matrix paketini kullanarak R'de seyrek bir matris oluşturun ve SVD için irlba'yı deneyin . Sonuçta kaç tane tekil vektör istediğinizi belirleyebilirsiniz, bu da hesaplamayı sınırlamanın başka bir yoludur.

Bu oldukça büyük bir matris, ancak geçmişte bu yöntemle çok iyi sonuçlar aldım. irlbagüzel bir sanat eseri. Bu kullanır örtülü yeniden Lanczos iki köşegenleştirilmesi algoritması .

Netflix ödül veri setini (480,189 satır 17,770 sütun, 100,480,507 sıfır olmayan giriş) milisaniyede çiğneyebilir. Siz veri kümesi Netflix veri setinden ~ 200.000 kat daha büyük, bu yüzden bundan çok daha uzun sürüyor. Hesaplamayı birkaç gün içinde yapmasını beklemek makul olabilir.


veri matrisi hafızaya sığar, irlba ayrıştırmayı hafızadaki gibi idare eder mi?
Sonia

@Sonia: irlba çok hafıza verimli: yaklaşık bir çözüm hesaplar, tekil vektörlerin sayısını sınırlandırabilir ve seyrek matrisler üzerinde çalışmak üzere tasarlanmıştır. Bildiğim kadarıyla, kısmi SVD'leri hesaplamak için alacağın kadar hızlı.
Zach

@Sonia: İyi şanslar!
Zach

Bir bellek denemesi verdi ... Çalıştırmadan önce bir üçgen blok formu hesaplayacağım.
Sonia

@Sonia seyrek olarak sakladınız Matrixmı? Hesapladığınız tekil değerlerin sayısını sınırlandırmayı deneyin ... belki de ilk 10'a bakabilirsiniz?
Zach

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.